(原来弗洛伊德不止是写xhs<梦的解析>啊哈哈哈哈)
嘿嘿
(好哦不是一个人)
求任意两点之间的最短路径
有些城市之间有公路,有些城市之间则没有.请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。
根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。那么这个中转的顶点k是1~n中的哪个点呢?甚至有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。
其实说白了,就是把所有中转遍历一下,找找最短的.
存数:
现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储。比如1号城市到2号城市的路程为2,则设e[1][2]的值为2。2号城市无法到达4号城市,则设置e[2][4]的值为∞。另外此处约定一个城市自己是到自己的也是0,例如e[1][1]为0.
1 核心代码: 2 for(k=1;k<=n;k++) 3 for(i=1;i<=n;i++) 4 for(j=1;j<=n;j++) 5 if(e[i][j]>e[i][k]+e[k][j]) 6 e[i][j]=e[i][k]+e[k][j];
整体代码:
标注:所有值初始值为正无穷 0xffffffff 或者直接找个比较大的值就好
1 #include 2 int main() 3 { 4 int e[10][10],k,i,j,n,m,t1,t2,t3; 5 int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值 6 //读入n和m,n表示顶点个数,m表示边的条数 7 scanf("%d %d",&n,&m); 8 //初始化 9 for(i=1;i<=n;i++) 10 for(j=1;j<=n;j++) 11 if(i==j) e[i][j]=0; 12 else e[i][j]=inf; 13 //读入边 14 for(i=1;i<=m;i++) 15 { 16 scanf("%d %d %d",&t1,&t2,&t3); 17 e[t1][t2]=t3; 18 } 19 //Floyd-Warshall算法核心语句 20 for(k=1;k<=n;k++) 21 for(i=1;i<=n;i++) 22 for(j=1;j<=n;j++) 23 if(e[i][j]>e[i][k]+e[k][j] ) 24 e[i][j]=e[i][k]+e[k][j]; 25 //输出最终的结果 26 for(i=1;i<=n;i++) 27 { 28 for(j=1;j<=n;j++) 29 { 30 printf("%10d",e[i][j]); 31 } 32 printf(" "); 33 } 34 return 0; 35 }
注意:负权值没有最短路!!!!!!!
(负权值就是说,有条路的长度是个负数)
因为负数的话会一直递归减少,所以是不行的!!!!