dijstra算法是为了求有向正权图的单源最短路径。
先是从一个源点开始,每条边松弛一次。再找到最近的点,以这个点继续松弛,vis数组置0。等到容器中为空时遍历完成。此时如果还有点的vis为0则它不能与源点连通。
可以适用于负权图的情况嘛?
不行,因为它用的是贪心算法,只会考虑点的相邻边。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int map[1005][1005];
int vis[1005],dis[1005];
void init(){
memset(map,INF,sizeof(map));
for(int i=0;i<nodenum;i++){
map[i][i]=0;
}
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
}
void create(){
for(int i=0;i<n;i++){
scanf("%d%d%d",&j,&k,&w);
map[j][k]=w;
}
}
void dj(){
for(int i=1;i<nodenum;i++){
dis[i]=map[0][i];
}
vis[0]=1;
for(int i=1;i<nodenum;i++)
{
min=INF;
for(int j=0;j<nodenum;j++){
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
mark=j;
}
}
vis[mark]=1;
for(int i=0;i<nodenum;i++){
if(!vis[i]&&(dis[mark]+map[mark][i]<dis[i])){
dis[i]=dis[mark]+map[mark][i];
}
}
}
return;
}