Floyd 算法

#include <iostream>        //每对顶点之间的最短路径,弗洛伊德(Floyd)算法
using namespace std;

const int MaxWeight=100000;
int Vertex,edge[1000][1000],distF[1000][1000],i,j;

void init()
{
for(i=1;i<=Vertex;i++) //结点坐标都是从1开始的
for(j=1;j<=Vertex;j++)
{
if(i==j)
edge[i][j]
=0;
else
edge[i][j]
=MaxWeight;
}
}
void floyd()
{
int k,pathF[1000][1000];
for(i=1;i<=Vertex;i++)
for(j=1;j<=Vertex;j++)
{
distF[i][j]
=edge[i][j];
if(i!=j&&distF[i][j]<MaxWeight)
pathF[i][j]
=i;
else
pathF[i][j]
=-1;
}
for(k=1;k<=Vertex;k++) //逐次增加中间顶点k
{
for(i=1;i<=Vertex;i++)
for(j=1;j<=Vertex;j++)
if(distF[i][k]+distF[k][j]<distF[i][j])
{
distF[i][j]
=distF[i][k]+distF[k][j];
pathF[i][j]
=pathF[k][j];
}
}
for(i=1;i<=Vertex;i++)
for(j=1;j<=Vertex;j++)
cout
<<"从第 "<<i<<" 个顶点到第 "<<j<<" 个顶点的最短路径是: "<<distF[i][j]<<endl;
cout
<<endl;
}
int main()
{
init();

floyd();
return 0;

  

//floyd 的变形
//poj9 3660 Cow Contest
#include <iostream> //floyd,给出一些点之间的限制条件,问有多少点的次序是固定的
using namespace std;
#define maxn 102
int n,m,edge[maxn][maxn],distF[maxn][maxn],i,j;
void floyd() //求出每对顶点之间的大小关系
{
int k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
distF[i][j]
=edge[i][j];
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(distF[i][k]!=0&&distF[i][k]==distF[k][j]) //如果a>b且b>c,则有a>c;同样,若a<b且b<c,则a<c
{
distF[i][j]
=distF[i][k];
}
}
}
int main()
{
int a,b;
cin
>>n>>m;
memset(edge,
0,sizeof(edge)); //表示任两点间的大小关系都不确定
while(m--)
{
cin
>>a>>b;
edge[a][b]
=1; // 1 表示a>b, 2 表示a<b ,0 表示 a,b的大小不确定
edge[b][a]=2;
}
floyd();
int res=0;
for(i=1;i<=n;i++)
{
int s=0;
for(j=1;j<=n;j++)
if(distF[i][j]>0)
s
++;
if(s==n-1) //说明该点与其他所有点的大小关系都已确定,所以该点的次序必是固定的
res++;
}
cout
<<res<<endl;
return 0;
}

  

posted on 2011-08-24 16:01  sysu_mjc  阅读(173)  评论(0编辑  收藏  举报

导航