首页 > 代码库 > codeforces 721C journey

codeforces 721C journey

1.暴力dp就可以。

2.不仅1号点没有入度。。。要把整张图拿去拓扑。再初始化的时候仅dp[1][1]=0即可。

3.inf要取好。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define amxn 5050#define maxv 5050#define maxe 5050#define inf 0x3f3f3f3fusing namespace std;int n,m,t,x,y,z,g[maxv],nume=0,d[maxv],pre[maxv][maxv];int s1[maxv],t1=0;int dp[maxv][maxv];struct edge{    int v,nxt;    int w;}e[maxe];queue <int> q;bool vis[maxv];void addedge(int u,int v,int w){    e[++nume].v=v;e[nume].w=w;    e[nume].nxt=g[u];g[u]=nume;}void bfs(){    dp[1][1]=0;    for (int i=1;i<=n;i++)    {        if (!d[i])        {            vis[i]=true;            q.push(i);        }    }    while (!q.empty())    {        int head=q.front();q.pop();        for (int i=g[head];i;i=e[i].nxt)        {            int v=e[i].v;            if (d[v])            {                d[v]--;                for (int j=2;j<=n;j++)                {                    if (dp[v][j]>dp[head][j-1]+e[i].w)                    {                        dp[v][j]=dp[head][j-1]+e[i].w;                        pre[v][j]=head;                    }                }                if (!d[v]) q.push(v);            }        }    }}int main(){    scanf("%d%d%d",&n,&m,&t);    for (int i=1;i<=m;i++)    {        scanf("%d%d%d",&x,&y,&z);        addedge(x,y,z);d[y]++;    }    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            dp[i][j]=inf;    bfs();    int tmp=n+1;    for (int i=n;i>=1;i--)    {        if (dp[n][i]<=t)        {            tmp=i;            break;        }    }    printf("%d\n",tmp);int now=n;    while (now!=1)    {        s1[++t1]=now;        now=pre[now][tmp];tmp--;    }    s1[++t1]=1;    for (int i=t1;i>=1;i--)        printf("%d ",s1[i]);    return 0;}

 

codeforces 721C journey