Dijkstra算法
●
给定图
G
和起点
s
,通过算法得到
S
到达其他每个顶点的最短距离。
●
基本思想:
对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合V中选择与起点s的最短距离最小的一个顶点(记为U),访问并加入集合S。之后,另顶点U为中介点,优化起点S与所有从U能到达的顶点V之间的最短距离(就是找到与U相连的顶点K,通过dis[U]计算出他们与顶点的距离dis[K])。这样的操作执行n次(n为顶点个数),直到集合S已包含所有顶点
#include<iostream>
#include<vector>
using namespace std;
class Graph {
public:
Graph(int N=0,int E=0,int type=0) {
this->N=N;
this->E=E;
this->type=type;
this->g=vector<vector<int> >(N+1,vector<int>(N+1,0));
}
int N,E;
int type;
vector<vector<int> >g;
print() {
for(int i=0; i<=N; i++) {
for(int j=0; j<=N; j++) {
cout<<g[i][j]<<" ";
}
cout<<endl;
}
}
add(int v,int d,int w) {
g[v][d]=w;
if(type==1) {
g[d][v]=w;
}
}
};
int dijkstra(int v,int d,Graph g){
const int INF=99999;
int vis[g.N+1]={0};
int dis[g.N+1];
int pre[g.N+1]={0};
fill(dis,dis+g.N+1,INF);
dis[v]=0;
for(int i=1;i<=g.N;i++){//循环遍历每个点
int v=-1;
int MIN=INF;
for(int j=1;j<=g.N;j++){//找出未访问的距离顶点最近的点v
if(vis[j]==0 && dis[j]<MIN){
v=j;
MIN=dis[j];
}
}
vis[v]=1;
for(int j=1;j<=g.N;j++){//找出与v相连的点,优化其与顶点的距离
int len=g.g[v][j];//边长
if(len>0 && len+dis[v]<dis[j]){
dis[j]=len+dis[v];//更新最短距离
pre[j]=v;//更新前置点
}
}
}
for(int i=1;i<=g.N;i++){
cout<<dis[i]<<" ";
}
}
int main(void) {
Graph g(7,12,1);
g.add(1,2,12);
g.add(1,7,16);
g.add(1,6,14);
g.add(2,7,7);
g.add(2,3,10);
g.add(3,7,6);
g.add(3,4,3);
g.add(3,5,5);
g.add(4,5,4);
g.add(5,7,2);
g.add(5,6,8);
g.add(6,7,9);
g.print();
dijkstra(4,7,g);
return 0;
}