[NOI2010]:海拔

来源:互联网 发布:烧饼修改器源码 编辑:程序博客网 时间:2024/04/27 21:27

传送门
想了想就发现其实就是求一个最小割,然后dinic直接上,只有90分
好像正解是对偶图SPFA最短路,以后再来补吧。。
代码:(dinic)

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define R registerusing namespace std;inline int read(){    int x=0;char ch=' ';int f=1;    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();    return x*f;}const int N=5e5+5,M=N*40;int n,tot=-1,s,t;int head[N],to[M],Next[M],flow[M],d[N],q[N],cur[N];inline void addedge(int x,int y,int c){    to[++tot]=y;Next[tot]=head[x];head[x]=tot;flow[tot]=c;    to[++tot]=x;Next[tot]=head[y];head[y]=tot;flow[tot]=0;}inline int id(int x,int y){return (x-1)*n+y;}inline bool bfs(){    for(R int i=s;i<=t;++i)d[i]=0x3f3f3f3f;    int l=1,r=1;q[1]=s;d[s]=0;    while(l<=r){        int x=q[l++];        for(int i=head[x];~i;i=Next[i]){            int u=to[i];            if(flow[i]&&d[u]>d[x]+1){                d[u]=d[x]+1;                q[++r]=u;            }        }    }    return d[t]!=0x3f3f3f3f;}inline int dfs(int x,int a){    if(x==t||!a)return a;    int F=0,f;    for(int &i=cur[x];~i;i=Next[i]){        int u=to[i];        if(flow[i]&&d[u]==d[x]+1&&(f=dfs(u,min(a,flow[i])))>0){            flow[i]-=f;            flow[i^1]+=f;            F+=f;a-=f;            if(!a)return F;        }    }    return F;}inline int dinic(){    int F=0;    while(bfs()){        for(R int i=s;i<=t;++i)cur[i]=head[i];        F+=dfs(s,0x3f3f3f3f);    }    return F;}int main(){    memset(head,-1,sizeof(head));    n=read()+1;s=1;t=n*n;    for(R int i=1;i<=n;++i)for(R int j=1;j<n;++j){int v=read();addedge(id(i,j),id(i,j+1),v);}    for(R int i=1;i<n;++i)for(R int j=1;j<=n;++j){int v=read();addedge(id(i,j),id(i+1,j),v);}    for(R int i=1;i<=n;++i)for(R int j=1;j<n;++j){int v=read();addedge(id(i,j+1),id(i,j),v);}    for(R int i=1;i<n;++i)for(R int j=1;j<=n;++j){int v=read();addedge(id(i+1,j),id(i,j),v);}    printf("%d",dinic());    return 0;}