FLOYD 方法
是求各个点到各个点最短的距离。
很显然,从一个点到另外点要不直接到到,要不经过一些点再到,反正头和尾是不变的。
#include<iostream>
using namespace std;
string ver[100];
int edge[100][100];
int d[100][100];
string p[100][100];
int v,a;
void floyd()
{
int i,j,k;
for(i=0;i<v;i++)
for(j=0;j<v;j++)
{
d[i][j]=edge[i][j];
if(d[i][j]!=999)
p[i][j]=ver[i]+ver[j];
else
p[i][j]="";
}
for(k=0;k<v;k++)
for(i=0;i<v;i++)
for(j=0;j<v;j++)
{
if(d[i][k]+d[k][j]<d[i][j])
{
d[i][j]=d[i][k]+d[k][j];
p[i][j]=p[i][k]+ver[j];
}
}
}
int main()
{
cin>>v>>a;
int a1,b1,c1;
string vv[100]={"v0 ", "v1 ","v2 ","v3 ","v4 ","v5 ","v6 ","v7 "};
for(int i=0;i<100;i++)
ver[i]=vv[i];
for(int i=0;i<v;i++)
for(int j=0;j<v;j++)
{
edge[i][j]=999;
}
for(int i=0;i<v;i++)
for(int j=0;j<v;j++)
{
if(i==j)
edge[i][j]=0;
}
while(a--)
{
cin>>a1>>b1>>c1;
edge[a1][b1]=c1;
}
floyd();
for(int i=0;i<v;i++)
for(int j=0;j<v;j++)
{
if(d[i][j]!=0&&p[i][j]!=""&&i!=j)
cout<<d[i][j]<<" "<<p[i][j]<<endl;
}
return 0;
}