[BZOJ 2007] 海拔
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2007
Algorithm:
由于起点高度为0,终点高度为1,明显没有必要有比1大的点
因此得到结论:原图仅由0和1构成,且0和1不交错排布
那么所有对答案的贡献都来自于0和1的分界线,那么就将问题转化为求最小割
但点数过多,网络流明显会超时,那么此时就要用到对偶图了
如果一个图是平面图(无边的相交),则可以将面化为点,构建对偶图,如下图所示
![[BZOJ 2007] 海拔 [BZOJ 2007] 海拔](https://cdn.ancii.com/article/image/v1/4W/pa/lF/FlpWa4AhPQ_yBevMrRK6EIb5q_USRufbqvuQ6Huifi6rqc2jH71TBJTfmmI23jt8A9IZMYD3yD370TEbERIxnA.jpg)
这样就能把求平面图的最小割问题 --------> 求其对偶图的ST最短路 妙啊
由于此题为有向图,每条边的从S到T还是从T到S的性质不能改变
因此原左右、上下边现在由S到T,而右左、下上由T到S
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=500+10;
int num[MAXN][MAXN],n,s,t;
vector<P> G[MAXN*MAXN];
ll dist[MAXN*MAXN];
queue<int> que;
inline int read()
{
    char ch;int num,f=0;
    while(!isdigit(ch=getchar())) f|=(ch=='-');
    num=ch-'0';
    while(isdigit(ch=getchar())) num=num*10+ch-'0';
    return f?-num:num;
}
void add_edge(int x,int y,int val)
{
    G[x].push_back(P(y,val));
}
int main()
{
    n=read();s=0;t=n*n+1;
    for(int i=1;i<=n;i++)
        num[0][i]=num[i][n+1]=s,num[i][0]=num[n+1][i]=t;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            num[i][j]=(i-1)*n+j;
    
    int x;    
    for(int i=0;i<=n;i++)
        for(int j=1;j<=n;j++)
            x=read(),add_edge(num[i][j],num[i+1][j],x);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=n;j++)
            x=read(),add_edge(num[i][j+1],num[i][j],x);
    for(int i=0;i<=n;i++)
        for(int j=1;j<=n;j++)
            x=read(),add_edge(num[i+1][j],num[i][j],x);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=n;j++)
            x=read(),add_edge(num[i][j],num[i][j+1],x);
    
    memset(dist,0x3f,sizeof(dist));
    que.push(s);dist[s]=0;
    while(!que.empty())
    {
        int u=que.front();que.pop();
        for(int i=0;i<G[u].size();i++)
        {
            P t=G[u][i];int v=t.first;
            if(dist[v]>dist[u]+t.second)
                dist[v]=dist[u]+t.second,que.push(v);
        }
    }
    cout << dist[t];
    return 0;
} 相关推荐
  哈嘿Blog    2020-10-26  
   明月清风精进不止    2020-07-05  
   xirongxudlut    2020-06-28  
   kkpiece    2020-06-16  
   qscool    2020-06-12  
   CloudXli    2020-06-11  
   vs00ASPNET    2020-06-09  
   Dimples    2020-06-08  
   kuoying    2020-06-07  
   JJandYY    2020-05-31  
   Wyt00    2020-05-30  
   liuyh    2020-04-03  
   CloudXli    2020-05-11  
   世樹    2020-05-11  
   bizercsdn    2020-05-10  
   joyjoy0    2020-05-09