djkstra 我的dijkstra模板

来源:互联网 发布:三星s4支持3g网络吗 编辑:程序博客网 时间:2024/05/23 02:10
//根据大神模板修改加注释的我的小菜鸟模板,如有错误欢迎指正!#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;}

原创粉丝点击