代码实现很简单,但是这个算法的思想是动态规划,所以个人感觉理解不是很好理解,反正我写了N多次还是时常犯嘀咕,晕头。
代码:
#include<iostream>
#include<fstream>
using namespace std;
int graph[101][101];
int path[101][101];
int size;
void floyd()
{
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
if(i!=j)
path[i][j]=i;
else
path[i][j]=-1;
}
for(int k=1;k<=size;k++)
{
for(int i=1;i<=size;i++)
{
if(i!=k)
for(int j=1;j<=size;j++)
{
if(j!=k&&j!=i&&graph[i][j]>graph[i][k]+graph[k][j])
{
graph[i][j]=graph[i][k]+graph[k][j];
path[i][j]=path[k][j];
}
}
}
}
}
void showPath(int i,int j)
{
if(i==path[i][j])
{
cout<<i<<"->";
return;
}
else
{
showPath(i,path[i][j]);
showPath(path[i][j],j);
}
}
int main()
{
ifstream in;
in.open("graph.txt",ios::in);
in>>size;
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
{
in>>graph[i][j];
}
}
in.close();
floyd();
ofstream out;
out.open("result.txt",ios::out);
out<<"Cost:"<<endl;
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
{
out<<graph[i][j]<<"\t";
}
out<<endl;
}
out<<endl;
out<<"Path"<<endl;
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
{
out<<path[i][j]<<"\t";
}
out<<endl;
}
int s,d;
cout<<"Input s and d"<<endl;
cin>>s>>d;
while(s!=0&&d!=0)
{
showPath(s,d);
cout<<d<<endl;
cin>>s>>d;
}
return 0;
}