Floyd算法

´Floyd算法则是需要求出任意两点之间的最短路。(保证有最短路,没有负环)
´我们通过dis[i][j]表示从i到j的最短路径。
´然后最开始我们设dis[i][i]=0,dis[i][j]=+oo。
´然后接下来我们尝试从逐个逐个中间点的添加,以扩展路径长度
´理论上该算法也可以采用多次dijkstra算法或者多次Bellman-Ford算法来解决,但直接采用Floyd算法将可以大大减小编程复杂度
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=100;
 5 const int oo=10000000;
 6 int n,m;
 7 int dis[maxn][maxn];
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for (int i=1;i<=n;i++) 
12      for (int j=1;j<=n;j++)
13       if (i!=j)
14        dis[i][j]=oo;
15     for (int i=1;i<=m;i++)
16     {
17         int x,y,z;
18         scanf("%d%d%d",&x,&y,&z);
19         dis[x][y]=min(dis[x][y],z);
20     }
21     for (int k=1;k<=n;k++)
22      for (int i=1;i<=n;i++)
23       for (int j=1;j<=n;j++)
24        if (dis[i][k]!=oo && dis[k][j]!=oo)
25         dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
26     for (int i=1;i<=n;i++)
27     {
28         for (int j=1;j<=n;j++) printf("%d ",dis[i][j]);
29         printf("\n");
30     }
31     return 0;
32  } 

 

posted @ 2017-01-25 16:32  Mr.9Pounds15Pence  阅读(106)  评论(0编辑  收藏  举报