首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。