首页 > 代码库 > floyd
floyd
求任意两点之间的最短路径。e[i][j]为记录从i到j之间的距离,当循环结束后最后存储的就是i到j之间的最短路径啦。
floyd算法就是对于给定的n个结点,对于每一个e[i][j],都让它经过1,然后比较e[i][j]和e[i][1]+e[1][j]的大小,来更新e[i][j],再用2依次比较一下,同理,一直到n个结点都比较一次,所以就成了3层循环。但是我们要注意一下,floyd算法不适合带有负权值的问题,因为当存在负权值的时候就会一直循环下去,找不到最小值。而且效率有些低。。。。
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f; 7 int e[1004][1004]; 8 int main(){ 9 int m,n;10 while(cin>>n>>m){11 for(int i=1;i<=n;i++){12 for(int j=1;j<=n;j++){13 if(i==j)e[i][j]=0;14 else15 e[i][j]=inf;16 }17 }18 int t1,t2,t3;19 for(int i=1;i<=m;i++){20 cin>>t1>>t2>>t3;21 e[t1][t2]=t3;22 }23 for(int k=1;k<=n;k++)///要经过的结点24 for(int i=1;i<=n;i++)25 for(int j=1;j<=n;j++)26 if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];///更新结点27 for(int i=1;i<=n;i++){28 for(int j=1;j<=n;j++){29 printf("%10d",e[i][j]);30 }31 cout<<endl;}32 }33 }
floyd
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。