【Algothrim】 FLoyd

来源:互联网 发布:软件的性能指标 编辑:程序博客网 时间:2024/05/17 23:40


思想:

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。


状态转移方程: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};


核心代码:

for(i=1;i<=L;i++)
  {
   for(j=1;j<=L;j++)
   {
    for(k=1;k<=L;k++)
    {
     if(dist[i][j]>dist[i][k]+dist[k][j])
      dist[i][j]=dist[i][k]+dist[k][j];
    }
   }
  }


完整代码:

#include<stdio.h>
#include<stdlib.h>
#define max 1000000000
int d[1000][1000],path[1000][1000];
int main()
{
int i,j,k,m,n;
int x,y,z;
scanf("%d%d",&n,&m);
 
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
    d[i][j]=max;
    path[i][j]=j;
}
 
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
d[x][y]=z;
d[y][x]=z;
}
 
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(d[i][k]+d[k][j]<d[i][j]){
    d[i][j]=d[i][k]+d[k][j];
    path[i][j]=path[i][k];
    }
}
 
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
  if (i!=j) printf("%d->%d:%d\n",i,j,d[i][j]);
 
int f,en;
scanf("%d%d",&f,&en);
while (f!=en){
    printf("%d->",f);
    f=path[f][en];
}
printf("%d\n",en);
 
return 0;
}

真的想说图灵奖颁给他只是实至名归!20世纪50年代初期美国经济不太景气,找工作比较困难,因学习文学而没有任何专门技能的弗洛伊德在就业上遇到很大麻烦,无奈之中到西屋电气公司当了二年计算机操作员,在IBM650机房值夜班。到1978年就获得了图灵奖。大写的牛!
0 0