B - 数据结构实验之图论十一:AOE网上的关键路径
题目链接 https://acm.sdut.edu.cn/onlinejudge3/contests/3990/problems/B
1 #include<bits/stdc++.h> 2 #define maxn 50010 3 using namespace std; 4 int n,m,t;//t源点 5 int dis[maxn],path[maxn],in[maxn]; 6 //dis(i到汇点的最大路径),path(存放i的下一个点),in(入度) 7 8 struct node 9 { 10 int u,v,w; 11 }edge[maxn]; 12 13 void bellman(int n,int m) 14 { 15 for(int i=2; i<=n; i++) 16 {//除去源点,只需要进行n-1次求值 17 int flag=0;//标记是否所有点都已更新 18 for(int j=1; j<=m; j++) 19 { 20 if((dis[edge[j].u]<dis[edge[j].v]+edge[j].w)||((dis[edge[j].u]==dis[edge[j].v]+edge[j].w)&&(edge[j].v<path[edge[j].u]))) 21 { 22 dis[edge[j].u]=dis[edge[j].v]+edge[j].w; 23 path[edge[j].u]=edge[j].v;//如果有两条路径权值相同,保留字典序较小的 24 flag=1; 25 } 26 } 27 if(flag==0) break; 28 } 29 cout<<dis[t]<<endl; 30 int k=t; 31 while(path[k]!=0) 32 { 33 cout<<k<<" "<<path[k]<<endl; 34 k=path[k]; 35 } 36 } 37 38 int main() 39 { 40 while(scanf("%d%d",&n,&m)!=EOF) 41 { 42 memset(in,0,sizeof(in)); 43 memset(dis,0,sizeof(dis)); 44 memset(path,0,sizeof(path)); 45 for(int i=1; i<=m; i++) 46 { 47 int u,v,w; 48 cin>>u>>v>>w; 49 edge[i].u=u; 50 edge[i].v=v; 51 edge[i].w=w; 52 in[v]++; 53 } 54 for(int i=1; i<=n; i++) 55 {//寻找源点 56 if(in[i]==0) t=i; 57 } 58 bellman(n,m); 59 } 60 return 0; 61 }