bzoj1001

来源:互联网 发布:阿里云免费建站 编辑:程序博客网 时间:2024/05/07 05:21

直接网络流。。


/**************************************************************    Problem: 1001    User: OZY123    Language: C++    Result: Accepted    Time:2236 ms    Memory:131024 kb****************************************************************/ #include<cstdio>#include<cstring>const int N=1005*1005;const int MAX=1<<27;int n,m;struct qq{    int x,y;    int last;    int z,other;}s[N*3*2];int last[N],num;int init2 (int x,int y,int z){    num++;    s[num].x=x;s[num].y=y;s[num].z=z;    s[num].last=last[x];last[x]=num;    return num;}void init1 (int x,int y,int z){    int num1=init2(x,y,z),num2=init2(y,x,z);    s[num1].other=num2;s[num2].other=num1;    return ;}void init (){    num=0;    memset(last,-1,sizeof(last));    int a;    scanf("%d%d",&n,&m);    for (int u=1;u<=n;u++)        for (int i=1;i<m;i++)        {            scanf("%d",&a);            init1((u-1)*m+i,(u-1)*m+i+1,a);        }    for (int u=1;u<n;u++)        for (int i=1;i<=m;i++)        {            scanf("%d",&a);            init1((u-1)*m+i,u*m+i,a);        }    for (int u=1;u<n;u++)        for (int i=1;i<m;i++)        {            scanf("%d",&a);            init1((u-1)*m+i,u*m+i+1,a);        }}int h[N],q[N];int st,ed;bool bt (){    memset(h,-1,sizeof(h));    st=1;ed=2;    q[st]=1;h[1]=1;    while (st!=ed)    {        int x=q[st];        //printf("%d\n",x);        for (int u=last[x];u!=-1;u=s[u].last)        {            int y=s[u].y;            if (s[u].z>0&&h[y]==-1)            {                h[y]=h[x]+1;                q[ed]=y;                ed++;                if (ed>=N-1)  ed=1;            }        }        st++;        if (st>=N-1) st=1;    }    if (h[n*m]==-1) return false;    return true;}int mymin (int x,int y){    return x<y?x:y;}int find (int x,int f){    if (x==n*m) return f;    int s1=0;    for (int u=last[x];u!=-1;u=s[u].last)    {        int y=s[u].y;        if (s1<f&&h[y]==(h[x]+1)&&s[u].z>0)        {            int ff=find(y,mymin(f-s1,s[u].z));            s1+=ff;            s[u].z-=ff;            s[s[u].other].z+=ff;        }    }    if (s1==0) h[x]=-1;    return s1;}void solve (){    int ans=0;    while (bt()==true)        ans=ans+find(1,MAX);    printf("%d\n",ans);}int main(){    init();    /*for (int u=1;u<=num;u++)    {        if (s[u].z==0) continue;        printf("%d %d %d\n",s[u].x,s[u].y,s[u].z);    }*/    solve();    return 0;}


1 0
原创粉丝点击