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 }

 

posted @ 2022-05-23 21:48  爱吃虾滑  阅读(37)  评论(0)    收藏  举报