1 条题解

  • 0
    @ 2026-6-19 0:02:39

    // 分层图最短路 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

    D79 分层图最短路 Dijkstra 算法 CF1473E Minimum Path

    信息

    ID
    12504
    时间
    3000ms
    内存
    300MiB
    难度
    10
    标签
    递交数
    7
    已通过
    4
    上传者