每对顶点间的最短路径——Floyd算法

来源:互联网 发布:客户结构优化 编辑:程序博客网 时间:2024/06/04 18:52

代码实现很简单,但是这个算法的思想是动态规划,所以个人感觉理解不是很好理解,反正我写了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;elsepath[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;}


原创粉丝点击