用于计算从单个源点到图中任意点的最短路问题(适用于边权值为正的情况)。
#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0xffffff
int 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 110
int 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];
}
}