最短路径模板

适应对象:有权图(有向或无向都行)

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算法

猜你喜欢

转载自www.cnblogs.com/shenyuling/p/9996159.html