1. 程式人生 > >最短路徑模板

最短路徑模板

適應物件:有權圖(有向或無向都行)

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]; } }
View Code

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; }
View Code

Dijkstra演算法