Dijkstra算法—带权重的图的单源最短路径问题
图G<V,E>
集合S:从源点s到S集合中的所有点的最短路径已经被确定。
基于-贪心算法
- 松弛操作:刚确定一个点的最短路径后,遍历一遍与该点连接的点,更新这些点到源点s的距离。
- 从V-S的集合中找出距源点距离最短的点,将该点加入集合S中。
实现数据结构:
- map:用一个二维矩阵储存顶点的连接与距离信息
- distance:用一个一维矩阵储存单源点到各点的最短路径信息
- ss:当前松弛点;connect[i]标记i加入S;
代码块
- init:初始化将map初始化为∞;
- get_map:得到地图信息;
- Dijkstra:实现贪心算法;
具体代码如下
#include<iostream>
#include<stdio.h>
#define len 2510
#define INF 0x7ffffff
using namespace std;
int G[len][len];
void init(int n);
void get_map(int m);
int dijkstra(int n,int m,int s,int des);
int main(){
int n,m,s,des;
scanf("%d%d%d%d",&n,&m,&s,&des);
init(n);
get_map(m);
printf("%d",dijkstra(n,m,s,des));
return 0;
}
void init(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
G[i][j]=INF;
}
for(int i=1;i<=n;i++){
G[i][i]=0;
}
}
void get_map(int m){
int u,v,w;
while(m--){
scanf("%d%d%d",&u,&v,&w);
G[u][v]=w;
G[v][u]=w;
}
}
int dijkstra(int n,int m,int s,int des){
int S_count=0,div[len],connect[len];
for(int i=1;i<=n;i++)
div[i]=INF,connect[i]=0;
S_count=1,div[s]=0,connect[s]=1;
int ss=s;
while(S_count<n){
int div_min=INF,temp_ss;
for(int i=1;i<=n;i++){
if(connect[i]==0){
if((div[ss]+G[ss][i])<div[i])
div[i]=div[ss]+G[ss][i];
if(div[i]<div_min){
div_min=div[i];
temp_ss=i;
}
}
}
ss=temp_ss;
connect[ss]=1;
S_count++;
}
return div[des];
}