原始模板:
时间复杂度O()
使用于图很满的情况
struct Node{
int y,v;
Node(int _y,int _v){y=_y;v=_v;}
};
vector<Node> edge[N+1];
int n,m,dist[N+1];
bool b[N+1];
int Dijistra(int s,int t){
memset(b,false,sizeof(b));
memset(dist,127,sizeof(dist));
dist[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];
}
优化后版本:
时间复杂度:O( (m+n) * lg n )
适用于图不满的情况
struct Node{
int y,v;
Node(int _y,int _v){y=_y;v=_v;}
};
vector<Node> edge[N+1];
int n,m,dist[N+1];
set<pair<int,int>>q;
int Dijistra(int s,int t){
memset(dist,127,sizeof(dist));
dist[s]=0;
for(int i=1;i<=n;i++){
q.insert({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({dist[i.y],i.y});
dist[i.y]=dist[x]+i.v;
q.insert({dist[i.y],i.y});
}
}
return dist[t];
}