djkstra 我的dijkstra模板

//根據大神模板修改加註釋的我的小菜鳥模板,如有錯誤歡迎指正!
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=1005;
const int MAX=0x3f3f3f3f;
int mapa[N][N];             //鄰接矩陣存圖的結構
int flag[N],dis[N];           //flag 標記數組,標記點是否已訪問   //dis記錄固定起點(一般以1爲例)到各點的距離
int dijkstra(int n,int m)
{
    for(int i=1;i<=n;i++)
        dis[i]=mapa[1][i];             //記錄與1直接相連的點距離1的最短距離
    flag[1]=1;                      //1點已訪問
    dis[1]=0;                       //點1到自身的距離爲0
    int k=0;                           //k初始化爲0,避免題目中出現無法到達時,flag[k]=1無法賦值而出現segmentation  core  dump
    for(int i=1;i<=n;i++){
        int min=MAX;                //min 記錄最小值
        for(int j=1;j<=n;j++)
            if(flag[j]==0&&min>dis[j]){         //找未訪問過的點中距離已訪問點的最小值及點k
                min=dis[j];
                k=j;
            }
       //或者 if(k)
            flag[k]=1;              //flag[k]=1   在答案爲no時,k不改變,保留原值,所以一開始初始化k=0
                                            //k!=0:標記k爲已訪問
        for(int j=1;j<=n;j++)
            if(flag[j]==0&&dis[j]>dis[k]+mapa[k][j])       //引入k點,將dis中與k連通後距離變小的更新
                dis[j]=dis[k]+mapa[k][j];
    }
    return dis[n];                              //返回想到達的點的最短距離值
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))                     //n個點  m條路
    {
        for(int i=0;i<=N-1;i++){
                dis[i]=MAX;                                           //dis初始化爲MAX,表示無窮遠,無法連通
                flag[i]=0;                                              //標記數組flag初始化爲0
            for(int j=0;j<=N-1;j++)
            {
                mapa[i][j]=MAX;                                 //鄰接矩陣初始化爲無窮遠
            }
        }
        int x,y,z;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(z<mapa[x][y])                                          //防止重邊
                    mapa[x][y]=z;                                //有向圖
                                                                                //無向圖 mapa[x][y]=mapa[y][x]=z;
        }
        int count=dijkstra(n,m);
        if(count==MAX)
            printf("No\n");
        else
            printf("%d\n",count);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章