- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #define N 50500
- struct node
- {
- int u,v,w;
- }edge[N];
- int path[N],dis[N],in[N],out[N],ans;
- void bellman(int n,int m)
- {
- memset(path,0,sizeof(path));
- memset(dis,0,sizeof(dis));
- for(int j = 2;j <= n;j++)
- {
- int temp = 0;
- for(int i = 1;i <= m;i++)
- {
- if((dis[edge[i].v] < dis[edge[i].u]+edge[i].w) || ((dis[edge[i].v] == dis[edge[i].u]+edge[i].w)&&(edge[i].u < path[edge[i].v])))
- {
- dis[edge[i].v] = dis[edge[i].u]+edge[i].w;
- path[edge[i].v] = edge[i].u;
- temp = 1;
- }
- }
- if(!temp)
- break;
- }
- printf("%d\n",dis[ans]);
- int k = ans;
- while(path[k] != 0)
- {
- printf("%d %d\n",k,path[k]);
- k = path[k];
- }
- }
- int main()
- {
- int n,m;
- while(~scanf("%d %d",&n,&m))
- {
- memset(edge,0,sizeof(edge));
- memset(in,0,sizeof(in));
- memset(out,0,sizeof(out));
- for(int i = 1;i <= m;i++)
- {
- int a,b,c;
- scanf("%d %d %d",&a,&b,&c);
- edge[i].u = b;
- edge[i].v = a;
- edge[i].w = c;
- in[a]++;
- out[b]++;
- }
- for(int i = 1;i <= n;i++)
- {
- if(out[i] == 0)
- ans = i;
- }
- bellman(n,m);
- }
- return 0;
- }
数据结构实验之图论十一:AOE网上的关键路径
最新推荐文章于 2018-09-07 00:26:20 发布