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;
}

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