数据结构实验之图论十一:AOE网上的关键路径

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<stdlib.h>  
  4. #define N 50500  
  5. struct node  
  6. {  
  7.     int u,v,w;  
  8. }edge[N];  
  9. int path[N],dis[N],in[N],out[N],ans;  
  10. void bellman(int n,int m)  
  11. {  
  12.     memset(path,0,sizeof(path));  
  13.     memset(dis,0,sizeof(dis));  
  14.     for(int j = 2;j <= n;j++)  
  15.     {  
  16.         int temp = 0;  
  17.         for(int i = 1;i <= m;i++)  
  18.         {  
  19.             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])))  
  20.             {  
  21.                 dis[edge[i].v] = dis[edge[i].u]+edge[i].w;  
  22.                 path[edge[i].v] = edge[i].u;  
  23.                 temp = 1;  
  24.             }  
  25.         }  
  26.         if(!temp)  
  27.                 break;  
  28.     }  
  29.     printf("%d\n",dis[ans]);  
  30.     int k = ans;  
  31.     while(path[k] != 0)  
  32.     {  
  33.         printf("%d %d\n",k,path[k]);  
  34.         k = path[k];  
  35.     }  
  36. }  
  37. int main()  
  38. {  
  39.     int n,m;  
  40.     while(~scanf("%d %d",&n,&m))  
  41.     {  
  42.         memset(edge,0,sizeof(edge));  
  43.         memset(in,0,sizeof(in));  
  44.         memset(out,0,sizeof(out));  
  45.         for(int i = 1;i <= m;i++)  
  46.         {  
  47.             int a,b,c;  
  48.             scanf("%d %d %d",&a,&b,&c);  
  49.             edge[i].u = b;  
  50.             edge[i].v = a;  
  51.             edge[i].w = c;  
  52.             in[a]++;  
  53.             out[b]++;  
  54.         }  
  55.         for(int i = 1;i <= n;i++)  
  56.         {  
  57.             if(out[i] == 0)  
  58.                 ans = i;  
  59.         }  
  60.         bellman(n,m);  
  61.     }  
  62.     return 0;  
  63. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值