(笔记)Dijkastra
New version
v1:
typedef long long LL;
typedef pair<LL,int> PII;
const int N=1e5+5,M=5e5+5;
const LL INF=1e16;
struct Node{int v,next,w,u;};
LL dis[N];
int head[N],idx;
Node adj[M<<1];
void ins(int x,int y,int z){
adj[++idx].v=y;
adj[idx].u=x;
adj[idx].next=head[x];
adj[idx].w=z;
head[x]=idx;
}
void undo(){
if(!idx)return ;
head[adj[idx].u]=adj[idx].next;
idx--;
}
void init(){
idx=0;
for(int i=1;i<=n+2;i++)
head[i]=0;
}
priority_queue<PII,vector<PII>,greater<PII> >q;
void dijkstra(int st){
for(int i=1;i<=n+2;i++)dis[i]=INF;
dis[st]=0;q.push(make_pair(0,st));
while(!q.empty()){
int u=q.top().second;
LL d=q.top().first;
q.pop();
for(int i=head[u];i;i=adj[i].next){
int v=adj[i].v;
int w=adj[i].w;
if(d+w<dis[v])dis[v]=d+w,q.push(make_pair(dis[v],v));
}
}
}
int id[N];
v2:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=1e6+5,INF=1e9;
int n,m,r,Q;
int head[N],idx;
struct Edge{
int v,next;
}adj[N<<1];
void ins(int x,int y){
adj[++idx].v=y;
adj[idx].next=head[x];
head[x]=idx;
}
int dis[N];
priority_queue<PII,vector<PII>,greater<PII> >q;
void dij(){
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[r]=0;
q.push(make_pair(0,r));
while(!q.empty()){
int u=q.top().second;
q.pop();
for(int i=head[u];i;i=adj[i].next){
int v=adj[i].v;
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
q.push(make_pair(dis[v],v));
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>r;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
ins(u,v);ins(v,u);
}
dij();
return 0;
}
Old version
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long>PII;
const int N = 2000005;
struct node{
long long v,w,next;
node(){
next=w=0;
}
node(long long a,long long b,long long c){
v=a;w=b;next=c;
}
};
node adj[N];
long long h[N],s;
long long idx=1;
long long dist[N];
bool st[N];
long long n,m;
void insert(long long x,long long y,long long z){
adj[idx]=node(y,z,h[x] );
h[x] = idx;
idx++;
}
void dijkstra(){
memset(dist, 0x3f3f3f3f, sizeof(dist));
dist[s] = 0;
priority_queue< PII, vector<PII>, greater<PII> > heap; // 定义一个小根堆
heap.push({ 0, s }); // 这个顺序不能倒,pair排序时是先根据first,再根据second,这里显然要根据距离排序
while (heap.size())
{
PII k = heap.top() ; // 取不在集合S中距离最短的点
heap.pop();
int ver = k.second;
int distance = k.first;
if (st[ver]) continue;
st[ver] = 1 ; //把该点加入集合S
for (int i = h[ver]; i !=0; i = adj[i].next)//在点中依次找相连点
{
int j = adj[i].v; //取出和ver相连的点
if (dist[j] > distance + adj[i].w)
{
dist[j] = distance+adj[i].w;
heap.push({dist[j],j});
}
}
}
}
int main(){
scanf("%lld%lld%lld",&n,&m,&s);//writing code
while(m--){
long long x,y,c;
scanf("%lld%lld%lld",&x,&y,&c);
insert(x,y,c);
}
dijkstra();
for(int i=1;i<=n;i++)printf("%lld ",dist[i]);//依次输出该点与其他点的最小相连路径
}