最短路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;
}
原文地址:https://www.cnblogs.com/54zyq/p/3114264.html