Stockbroker Grapevine

本文详细介绍了Floyd最短路径算法的实现原理及代码实现过程,通过具体实例展示了如何利用该算法解决图中任意两点间的最短路径问题。

http://poj.org/problem?id=1125

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define MAXN 110
 6 using namespace std;
 7 const int INF=1<<28;
 8 int dis[MAXN][MAXN];
 9 int n,t,a,b;
10 void inti()
11 {
12     for(int i=1; i<=n; i++)
13     {
14         for(int j=1; j<=n; j++)
15         {
16             dis[i][j]=dis[j][i]=INF;
17         }
18     }
19 }
20 int main()
21 {
22     while(scanf("%d",&n)&&n)
23     {
24         inti();
25         for(int i=1; i<=n; i++)
26         {
27             scanf("%d",&t);
28             while(t--)
29             {
30                 scanf("%d%d",&a,&b);
31                 dis[i][a]=b;
32             }
33         }
34         for(int k=1; k<=n; k++)
35         {
36             for(int i=1; i<=n; i++)
37             {
38                 for(int j=1; j<=n; j++)
39                 {
40                     dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
41                 }
42             }
43         }
44         int cc,tt=-1,mark=1;
45         for(int i=1; i<=n; i++)
46         {
47             int t=-1,c;
48             bool flag=true;
49             for(int j=1; j<=n; j++)
50             {
51                 if(i!=j)
52                 {
53                     if(dis[i][j]==INF)
54                     {
55                         flag=false;
56                         break;
57                     }
58                     else if(dis[i][j]>t)
59                     {
60                         c=i;
61                         t=dis[i][j];
62                     }
63                 }
64                 else continue;
65             }
66             if(flag)
67             {
68                 if(mark)
69                 {
70                     cc=c;
71                     tt=t;
72                     mark=0;
73                 }
74                 else if(t<tt)
75                 {
76                     cc=c;
77                     tt=t;
78                 }
79             }
80         }
81         if(tt==-1) printf("disjoint\n");
82         else printf("%d %d\n",cc,tt);
83     }
84     return 0;
85 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3255118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值