hdu4307 Matrix 最小割

来源:互联网 发布:路由器网络参数设置 编辑:程序博客网 时间:2024/05/01 15:51

...其实SAP也可以写的很短!!,不考虑bfs优化的话20行代码... 

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int inf=0x3fffffff;const int maxn=1005;struct edge{    int to,ec,next,rev;}ee[maxn*maxn*2];int e[maxn],ecnt;int st,ed,d[maxn],gap[maxn],n,m;queue<int> q;bool inq[maxn];void addedge(int u,int v,int c){    ee[ecnt].to=v;ee[ecnt].ec=c;ee[ecnt].next=e[u];ee[ecnt].rev=ecnt+1;e[u]=ecnt++;    ee[ecnt].to=u;ee[ecnt].ec=0;ee[ecnt].next=e[v];ee[ecnt].rev=ecnt-1;e[v]=ecnt++;}void bfs(){    while(!q.empty())        q.pop();    int i,u,v,c;    memset(inq,false,sizeof(inq));    memset(gap,0,sizeof(gap));    memset(d,0,sizeof(d));    q.push(ed);d[ed]=0;inq[ed]=true;    while(!q.empty())    {        u=q.front();q.pop();        for(i=e[u];i!=-1;i=ee[i].next)        {            v=ee[i].to;c=ee[i].ec;            if(c==0&&!inq[v])            {                q.push(v);inq[v]=true;                d[v]=d[u]+1;            }        }    }    for(i=0;i<n;++i)        gap[d[i]]++;}int sap(int u,int flow){    if(u==ed)        return flow;    int i,res=flow,v,c,t;    for(i=e[u];i!=-1;i=ee[i].next)    {        v=ee[i].to;c=ee[i].ec;        if(c>0&&d[u]==d[v]+1)        {            t=sap(v,min(res,c));            ee[i].ec-=t;ee[ee[i].rev].ec+=t;            if(!(res-=t))                return flow;        }    }    if(!--gap[d[u]])        d[st]=n;    ++gap[++d[u]];    return flow-res;}int main(){    int t,i,j,u,v,c,sum,ans,tot,x;    scanf("%d",&t);    while(t--)    {        memset(e,-1,sizeof(e));ecnt=0;//        memset(d,0,sizeof(d));//        memset(gap,0,sizeof(gap));        scanf("%d",&n);        ans=0;tot=0;        st=0;ed=n+1;        for(i=1;i<=n;++i)        {            sum=0;            for(j=1;j<=n;++j)            {                scanf("%d",&x);                sum+=x;                addedge(i,j,x);            }            tot+=sum;            addedge(st,i,sum);        }        for(i=1;i<=n;++i)        {            scanf("%d",&x);            addedge(i,ed,x);        }        n+=2;        for(bfs();d[st]<n;)//        for(gap[0]=n;d[st]<n;)            ans+=sap(st,inf);        printf("%d\n",tot-ans);    }    return 0;}


 

 

原创粉丝点击