Dijkstra算法

样例输入:
1 6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
样例输出:
0 1 8 4 13 17




Dijkstra算法代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
    int a[102][102]={0};
    int dis[102];
    int book[102]={0};
    int h,n,m,k;
    int inf=99999999;
    cin>>h>>n>>m;//h表示单源最短路的源头,n表示共有顶点个数,m表示边的条数;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j)a[i][j]=0;
            else a[i][j]=inf;
        }
    }
    int t1,t2,t3;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&t1,&t2,&t3);
        a[t1][t2]=t3;
    }
    for(int i=1;i<=n;i++){
        dis[i]=a[h][i];
    }
    //下面就是Dijkstra核心算法
    k=n-1;
    book[h]=1;
    while(k--){
        int min1=inf,u;
        for(int i=1;i<=n;i++){
            if(book[i]==0&&dis[i]<min1){
                min1=dis[i];
                u=i;
            }
        }
        book[u]=1;
        for(int i=1;i<=n;i++){
            if(book[i]==0&&a[u][i]<inf&&dis[i]>a[u][i]+min1)
                dis[i]=a[u][i]+min1;
        }


    }
    for(int i=1;i<=n;i++){
        cout<<dis[i]<<" ";
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40788630/article/details/80146193