【BZOJ3894】文理分科 最小割 (再不刷它就土了,毕竟水题)

来源:互联网 发布:菠萝饭软件网页 编辑:程序博客网 时间:2024/04/28 15:38
#include <stdio.h>int main(){    puts("转载请注明出处[vmurder]谢谢");    puts("网址:blog.csdn.net/vmurder/article/details/43968955");}

啦啦啦啦Markdown啊

啦啦啦啦怎么用啊

啦啦啦啦公式板啊

还是别用Markdown啦

呜啊~~

上面的自己唱出来的留言板举爪~
好了,说题解。
嗯自己看代码build部分吧,就是这么的暴力!

#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define P 120#define N 30005#define M 300000 // 14*10000#define inf 0x3f3f3f3fusing namespace std;const int dx[]={0,0,0,1,-1};const int dy[]={0,1,-1,0,0};struct KSD{    int v,len,next;}e[M];int head[N],cnt;inline void add(int u,int v,int len){    e[++cnt].v=v;    e[cnt].len=len;    e[cnt].next=head[u];    head[u]=cnt;}inline void Add(int u,int v,int len){add(u,v,len),add(v,u,0);}int s,t,d[N];queue<int>q;bool bfs(){    while(!q.empty())q.pop();    memset(d,0,sizeof d);    int i,u,v;    q.push(s),d[s]=1;    while(!q.empty())    {        u=q.front(),q.pop();        for(i=head[u];i;i=e[i].next)        {            if(!d[v=e[i].v]&&e[i].len)            {                d[v]=d[u]+1;                if(v==t)return 1;                q.push(v);            }        }    }    return 0;}int dinic(int x,int flow){    if(x==t)return flow;    int remain=flow,i,v,k;    for(i=head[x];i&&remain;i=e[i].next)    {        if(d[v=e[i].v]==d[x]+1&&e[i].len)        {            k=dinic(v,min(remain,e[i].len));            if(!k)d[v]=0;            e[i].len-=k,e[i^1].len+=k;            remain-=k;        }    }    return flow-remain;}int n,m,maxflow;int id[P][P];void build(){    int i,j,k;    int a,b,c;    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)for(j=1;j<=m;j++)id[i][j]=++cnt;        s=cnt*3+1,t=cnt*3+2,cnt=1;    for(i=1;i<=n;i++)for(j=1;j<=m;j++) // 文科喜悦值    {        scanf("%d",&c);        Add(s,id[i][j],c);        maxflow+=c;    }    for(i=1;i<=n;i++)for(j=1;j<=m;j++) // 理科喜悦值    {        scanf("%d",&c);        Add(id[i][j],t,c);        maxflow+=c;    }    for(i=1;i<=n;i++)for(j=1;j<=m;j++) // 同文喜悦值    {        scanf("%d",&c);        Add(s,id[i][j]+n*m,c);        for(k=0;k<=4;k++)if(id[a=i+dx[k]][b=j+dy[k]])            Add(id[i][j]+n*m,id[a][b],inf);        maxflow+=c;    }    for(i=1;i<=n;i++)for(j=1;j<=m;j++) // 同理喜悦值    {        scanf("%d",&c);        Add(id[i][j]+2*n*m,t,c);        for(k=0;k<=4;k++)if(id[a=i+dx[k]][b=j+dy[k]])            Add(id[a][b],id[i][j]+2*n*m,inf);        maxflow+=c;    }}int main(){    freopen("test.in","r",stdin);    build();    while(bfs())maxflow-=dinic(s,inf);    printf("%d\n",maxflow);    return 0;}

^%^%$^%

1 0