Floyed算法
【思想】Floyed-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子路径来 得到最佳路径。 注意单 独一条边的路径也不一定是最佳路径。
从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。
对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
时间复杂度O(n^3),只要有存下邻接矩阵的空间,时间一般没问题,并且不必担心负权边的问题。
【实现】
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) map[i][j]=INF;
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&peo[i],&a,&b);
map[i][a]=1; map[a][i]=1;
map[i][b]=1; map[b][i]=1;
}
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j && j!=k && i!=k)
if (map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (a[i,k]=1)and (a[k,j]=1) then a[i,j]=1
{a[i,j]=1表示i可达j,a[i,j]=0表示i不可达j}