适应对象:有权图(有向或无向都行)
Floyd算法:
1.主要代码:
void floyd() { int i,j,k; for(i=0;i<g.n;i++) for(j=0;j<g.n;j++) { dist[i][j]=g.edges[i][j]; if(i!=j&&g.edges[i][j]<inf) path[i][j]=i;//有路 else path[i][j]=-1;// } for(k=0;k<g.n;k++) for(i=0;i<g.n;i++) for(j=0;j<g.n;j++) if(dist[i][j]>dist[i][k]+dist[k][j]) { dist[i][j]=dist[i][k]+dist[k][j]; path[i][j]=path[k][j]; } }
2.完整代码(题目地址:http://tk.hustoj.com/problem.php?id=1120)
#include<iostream> using namespace std; const int maxn=10; const int inf=32767; class Graph { struct matgraph { int n; int edges[maxn][maxn]; }; matgraph g; int dist[maxn][maxn];//存路径长度,比如dist[1][2]就是1->2的最短路径 int path[maxn][maxn];//具体路径 public : void make_matgraph(int n) { int m; g.n=n; cin>>m; for(int i=0;i<g.n;i++) for(int j=0;j<g.n;j++) if(i==j) g.edges[i][j]=0; else g.edges[i][j]=inf; for(int i=0;i<m;i++) { int a,b,c; cin>>a>>b>>c; g.edges[a-1][b-1]=c; g.edges[b-1][a-1]=c; } } void floyd() { int i,j,k; for(i=0;i<g.n;i++) for(j=0;j<g.n;j++) { dist[i][j]=g.edges[i][j]; if(i!=j&&g.edges[i][j]<inf) path[i][j]=i;//有路 else path[i][j]=-1;// } for(k=0;k<g.n;k++) for(i=0;i<g.n;i++) for(j=0;j<g.n;j++) if(dist[i][j]>dist[i][k]+dist[k][j]) { dist[i][j]=dist[i][k]+dist[k][j]; path[i][j]=path[k][j]; } } void ask() { int a,b; cin>>a>>b; a--; b--; if(dist[a][b]!=inf) { cout<<dist[a][b]<<endl; /* cout<<"路径:\n"; do { cout<<b+1<<" "; b=path[a][b]; }while(b!=-1);*/ } else cout<<"No path"<<endl; } }; int main() { Graph g; int n; while(cin>>n) { g.make_matgraph(n); g.floyd(); g.ask(); } return 0; }
Dijkstra算法