1 条题解
-
0

// 分层图最短路 Dijkstra 算法 O(MlogN) #include<bits/stdc++.h> #define int long long #define pii pair<int,int> using namespace std; const int N=8e5+5,M=4e6; int idx,h[N],to[M],ne[M],ww[M]; void add(int x,int y,int z){ to[++idx]=y,ww[idx]=z,ne[idx]=h[x],h[x]=idx; } int n,m; int d[N]; void dijkstra(){ memset(d,0x3f,sizeof d); d[1]=0; priority_queue<pii,vector<pii>,greater<pii>> q; //小根堆 q.push({0,1}); while(q.size()){ auto [dd,u]=q.top(); q.pop(); if(dd!=d[u]) continue; for(int i=h[u];i;i=ne[i]){ int v=to[i],w=ww[i]; if(d[v]>d[u]+w){ d[v]=d[u]+w; q.push({d[v],v}); } } } } void adde(int x,int y,int z){ add(x,y,z),add(x+n,y+n,z), add(x+2*n,y+2*n,z),add(x+3*n,y+3*n,z); //每层内连边 add(x,y+n,0),add(x+2*n,y+3*n,0); //1层向2层,3层向4层连max型边 add(x,y+2*n,2*z),add(x+n,y+3*n,2*z); //1层向3层,2层向4层连min型边 } signed main(){ scanf("%lld %lld",&n,&m); for(int i=1,x,y,z;i<=m;i++){ scanf("%lld %lld %lld",&x,&y,&z); adde(x,y,z); adde(y,x,z); } dijkstra(); for(int i=2;i<=n;i++)printf("%lld ",min(d[i],d[i+3*n])); }
- 1
信息
- ID
- 12504
- 时间
- 3000ms
- 内存
- 300MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 4
- 上传者