简介
常用于求无负权边图的最短路
介绍:初始时将c初始化为空,将s的距离设置为0,其余顶点的距离设置为无穷大
在每一轮中,将离起点最近的的(dist最小的,不能时无穷的)的还不在c中的点加入c,并且用这个点连出去的边通过松弛操作尝试更新其他点的dist
代码实现
时间复杂度o(n^2+m)
struct Node{
int y,v;//y表示连到哪里,v表示边权
Node(int _y,int _v){y= _y; v= _v};
};
vector<Node> edge[N+1];
int n,m,dist[N+1];//n顶点,m边,dist[]距离
bool b[N+1];//当前这个点有没有在c中
int Dijkstra(int s,int t){
//找s到t的最短路
memset(b,false,sizeof());
memset(dist,127,sizeof(dist));//将c设置为空,将s的距离设置为0,其余顶点的距离设置为无穷大
dist[s]=0;//s的距离设置为0
for(;;){
int x = -1;
for(int i = 1; i <=n; i++){
if(!b[i] && dist[i] <1 <<30)
if(x == -1 || dist[i] < dist[x])
x=i;
if(x == t || x== -1)
break;
b[x] = true;
for(auto i : edge[x])
dist[i.y] = min (dist[i.y] , dist[x] +i.v);
}
}
return dist[t];
}
算法优化
时间复杂度(n+m)logn
struct Node{
int y,v;
Node{int _y, int _v}{y = _y;v = _v};
};
set<pair<int,int>>q;
vector<Node> edge[N+1];
int n,m,dist[N+1];
itn Dijkstra(int s,int t){
memset(dist,127,sizeof(dist));
dist[s] = 0;q.clear();
for(int i =1; i <= n; i++)
q.insert(make_pair(dist[i],i));
for(;!q.empty();){
int x = q.begin()->second;
q.erase(q.begin());
if(x == t || dist[x] > 1<<30)
break;
for(auto i :edge[x]){
if(dist[x] + i.v<dist[i.y]){
q.erase(make_pair(dist[i.y],i.y));
dist[i.y] = dist[x] +i.v;
q.insert(make_pair(dist[i.y],i.y));
}
}
}
return dist[t];
}