luogu P3758 [TJOI2017]可乐 分层图dp

#pragma GCC optimize(2)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=39,M=150;
int n,m,t;
int h[N],e[M<<1],ne[M<<1],idx;
int f[1000002][32];
//f[j,u]表示在j时刻,在节点u的情况数 
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    //设置n+1为死亡节点 
    cin>>t;
    for(int i=1; i<=n; i++)
        add(i,n+1),add(i,i);
    f[0][1]=1;
    add(n+1,n+1);
    for(int j=0; j<=t; j++)
        for(int u=1; u<=n+1; u++)
            for(int i=h[u]; i!=-1; i=ne[i])
                f[j+1][e[i]]=(f[j+1][e[i]]+f[j][u])%2017;
    int ans=0;
    for(int i=1; i<=n+1; i++)
        ans=(ans+f[t][i])%2017;
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12929372.html