Dijkstra算法

来源:互联网 发布:group by 多个字段知乎 编辑:程序博客网 时间:2024/06/14 14:26

用于计算从单个源点到图中任意点的最短路问题(适用于边权值为正的情况)。

#include<iostream>#include<cstdio>#include<cstring>#define INF 0xffffffint visit[INF],map[100][100],dis[100],fa[100];void Dijkstra(){    memset(visit,0,sizeof(visit));    for(int i=1;i<n;i++) dis[i]=map[0][i];    for(int i=0;i<n;i++) fa[i]=i;    //初始化父节点    visit[0]=1;    for(int i=0;i<n;i++)    {        int k,temp=INF;        for(int j=0;j<n;j++)           if(!visit[j] && dis[j]<=temp)               temp=dis[k=j];        visit[k]=1;        for(int j=0;j<n;j++)           if(dis[j]>dis[k]+map[k][j])           {               dis[j]=dis[k]+map[k][j];  //更新最短路               fa[j]=k;    //更新父节点           }    }}


一样的意思。

#include<iostream>#include<cstdio>#include<cstring>#define INF 0xffffff#define MAX 110int dis[MAX],visit[MAX],map[MAX][MAX];int m,n;void Dijkstra(){    memset(visit,0,sizeof(visit));    for(int i=1;i<=n;i++) dis[i]=(i==1?0:INF);    for(int i=1;i<=n;i++)    {        int k,temp=INF;        for(int j=1;j<=n;j++)           if(!visit[j] && temp>dis[j])               temp=dis[k=j];        visit[k]=1;        for(int j=1;j<=n;j++)           if(map[k][j] && dis[j]>dis[k]+map[k][j])     //map[k][j]==0表示不存在该条路径。                dis[j]=dis[k]+map[k][j];    }}