zoukankan      html  css  js  c++  java
  • 最短路dijkstra示例程序

    先输入顶点个数n,然后输入每条边的数据。顶点序号从0开始,最后一行为-1 -1 -1,表示输入结束。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<string>
    #include<cmath>
    #include<map>
    using namespace std;
    
    const int INF=1000000;
    const int maxn=20;
    int n;
    int edge[maxn][maxn];
    int s[maxn];
    int dist[maxn];
    int path[maxn];
    
    void dijkstra(int v)
    {
        for(int i=0;i<n;i++)
        {
            dist[i]=edge[v][i];
            s[i]=0;
            if(i!=v && dist[i]<INF)
               path[i]=v;
            else path[i]=-1;
        }
        s[v]=1;dist[v]=0;//
        for(int i=0;i<n-1;i++)
        {
            int min=INF,u=v;
            for(int j=0;j<n;j++)
                if(!s[j] && dist[j]<min)
                {
                    u=j;min=dist[j];
                }
            s[u]=1;
            for(int k=0;k<n;k++)
                if(!s[k] && edge[u][k]<INF && dist[u]+edge[u][k]<dist[k])
                   {
                       dist[k]=dist[u]+edge[u][k];
                       path[k]=u;
                   }
        }
    }
    
    int main()
    {
        int u,v,w;
        scanf("%d",&n);
        memset(edge,0,sizeof(edge));
        while(1)
        {
            scanf("%d%d%d",&u,&v,&w);
            if(u==-1 && v==-1 && w==-1)
              break;
            edge[u][v]=w;
        }
        for(int i=0;i<n;i++)
           for(int j=0;j<n;j++)
               if(i!=j && edge[i][j]==0)
                  edge[i][j]=INF;
        dijkstra(0);
        int shortest[maxn];
        for(int i=1;i<n;i++)
        {
            printf("%d\t",dist[i]);
            memset(shortest,0,sizeof(shortest));
            int k=0;
            shortest[k]=i;
            while(path[shortest[k]]!=0)
            {
                k++;
                shortest[k]=path[shortest[k-1]];
            }
            k++;shortest[k]=0;
            for(int j=k;j>0;j--)
               printf("%d->",shortest[j]);
            printf("%d\n",shortest[0]);
        }
        return 0;
    }
  • 相关阅读:
    js计算两个时间相差天数
    享元模式
    外观模式
    组合模式
    装饰者模式
    桥接模式
    适配器模式
    元素量词 ? + *
    linux安装使用7zip
    linux shell使用别名,切换当前目录
  • 原文地址:https://www.cnblogs.com/54zyq/p/3114264.html
Copyright © 2011-2022 走看看