//Floyd算法和Dijkstra算法是求最短路径的算法,Dijkstra选定了Source,Floyd是求
//邻接矩阵G中Vi和Vj间的最短路径,1<=i,j<=Vertex
//用另一个矩阵P来包含最短通路经的信息,初始化为0
//如要寻找从V5到V1的路径。根据P,假如P(5,1)=3则说明从V5到V1经过V3,
//路径为{V5,V3,V1},如果P(5,3)=0,说明V5与V3直接相连,
//如果D(3,1)=0,说明V3与V1直接相连
#include <cstdlib>
#include <iostream>
#include<fstream>
#define Maxm 501
using namespace std;
ifstream fin("APSP.in");
ofstream fout("APSP.out");
int Vertex,Line[Maxm];
int Path[Maxm][Maxm],Map[Maxm][Maxm],Dist[Maxm][Maxm];
int k;
void Root(int p,int q)
{
if(Path[p][q]>0)
{
Root(p,Path[p][q]);
Root(Path[p][q],q);
}
else
{
Line[k]=q;
k++;
}
}
int main(int argc, char *argv[])
{
int p,q,m;
memset(Path,0,sizeof(Path));
memset(Map,0,sizeof(Map));
memset(Dist,0,sizeof(Dist));
fin>>Vertex;
for(p=1;p<=Vertex;p++)
{
for(q=1;q<=Vertex;q++)
{
fin>>Map[p][q];
Dist[p][q]=Map[p][q];
}
}
for(k=1;k<=Vertex;k++)
{
for(p=1;p<=Vertex;p++)
{
if(Dist[p][k]>0)
{
for(q=1;q<=Vertex;q++)
{
if(Dist[k][q]>0)
{
if(((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p!=q))
{
Dist[p][q]=Dist[p][k]+Dist[k][q];
Path[p][q]=k;
}
}
}
}
}
}
for(p=1;p<=Vertex;p++)
{
for(q=p+1;q<=Vertex;q++)
{
fout << "\n==========================\n";
fout<<"Source:"<<p<<"\n"<<"Target"<<q<<"\n";
if(Dist[p][q]==0)
{
fout<<"Distance:"<<"Infinity"<<"\n";
fout<<"Path:No way!"<<"\n";
}
else
{
fout<<"Distance:"<<Dist[p][q]<<"\n";
fout<<"Path:"<<p;
k=2;
Root(p,q);
for(m=2;m<=k-1;m++)
fout<<"-->"<<Line[m];
fout<<"\n";
}
fout << "==========================\n";
}
}
fin.close();
fout.close();
//system("PAUSE");
return EXIT_SUCCESS;
}