1 条题解

  • 0
    @ 2026-6-18 16:05:01

    // 对偶图最短路 Dijkstra 算法 O(MlogN)
    #include<bits/stdc++.h>
    #define pii pair<int,int>
    using namespace std;
    
    const int N=3e5,M=1.1e6;
    int to[M],ne[M],ww[M],h[N],idx;
    void add(int a,int b,int c){
      to[++idx]=b,ww[idx]=c,ne[idx]=h[a],h[a]=idx;
    }
    int n,s,t;
    int d[N];
    bool vis[N];
    
    void dijkstra(){
      memset(d,0x3f,sizeof d); d[s]=0;
      priority_queue<pii,vector<pii>,greater<pii> > q;
      q.push({0,s});
      while(!q.empty()){
        int u=q.top().second;q.pop();
        if(vis[u])continue;vis[u]=1;
        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});
          }
        }
      }
    }
    int get(int x,int y){
      return (x-1)*(n-1)+y;
    }
    int main(){
      cin>>n; n++;  //变成边数
      s=0; t=n*n+1; //t对偶图终点编号
      int w,v1,v2;
      for(int i=1;i<=n;++i)for(int j=1;j<n;++j){ //从左到右
        scanf("%d",&w);
        v1=get(i-1,j); //上点
        v2=get(i,j);   //下点
        if(i==1) add(v2,t,w);
        else if(i==n) add(s,v1,w);
        else add(v2,v1,w); //右格点高,下点连上点
      }
      for(int i=1;i<n;++i)for(int j=1;j<=n;++j){ //从上到下
        scanf("%d",&w);
        v1=get(i,j-1); //左点
        v2=get(i,j);   //右点
        if(j==1) add(s,v2,w);
        else if(j==n) add(v1,t,w);
        else add(v1,v2,w); //下格点高,左点连右点
      }
      for(int i=1;i<=n;++i)for(int j=1;j<n;++j){ //从右到左
        scanf("%d",&w);
        v1=get(i-1,j); //上点
        v2=get(i,j);   //下点
        if(i==1) add(t,v2,w);
        else if(i==n) add(v1,s,w);
        else add(v1,v2,w); //左格点高,上点连下点
      }
      for(int i=1;i<n;++i)for(int j=1;j<=n;++j){ //从下到上
        scanf("%d",&w);
        v1=get(i,j-1); //左点
        v2=get(i,j);   //右点
        if(j==1) add(v2,s,w);
        else if(j==n) add(t,v1,w);
        else add(v2,v1,w); //上格点高,右点连左点
      }
      
      dijkstra();
      printf("%d",d[t]);
    }
    
    • 1

    D85 对偶图最短路 Dijkstra 算法[NOI2010] 海拔

    信息

    ID
    3672
    时间
    2000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    12
    已通过
    3
    上传者