hdu4560 最大流+二分

來源:互聯網
上載者:User

這道題和3081很像,,n+1----n+1+m 建立容量為k的邊,如果map[i][j]==1 建立i---n+m+j容量為1的邊  否則建i----n+j容量為1的邊 然後二分具體見代碼。。

還有一般數組適當開大,不要太大,會TLE...

#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#define MAXN 500#define inf 0x3f3f3f3f#define MAXM 50000using namespace std;struct node{    int u,v,f;};node e[MAXM];int first[MAXN],next[MAXM];int gap[MAXN],d[MAXN],curedge[MAXN],pre[MAXN];int cc;int n,m,l,k;inline void add_edge(int u,int v,int f){    e[cc].u=u;    e[cc].v=v;    e[cc].f=f;    next[cc]=first[u];    first[u]=cc;    cc++;    e[cc].u=v;    e[cc].v=u;    e[cc].f=0;    next[cc]=first[v];    first[v]=cc;    cc++;}int ISAP(int s,int t,int n){    int cur_flow,flow_ans=0,u,tmp,neck,i,v;    memset(d,0,sizeof(d));    memset(gap,0,sizeof(gap));    memset(pre,-1,sizeof(pre));    for(i=0;i<=n;i++)        curedge[i]=first[i];    gap[0]=n+1;    u=s;    while(d[s]<n+1)    {        if(u==t)        {            cur_flow=inf;            for(i=s;i!=t;i=e[curedge[i]].v)            {                if(cur_flow>e[curedge[i]].f)                {                    neck=i;                    cur_flow=e[curedge[i]].f;                }            }            for(i=s;i!=t;i=e[curedge[i]].v)            {                tmp=curedge[i];                e[tmp].f-=cur_flow;                e[tmp^1].f+=cur_flow;            }            flow_ans+=cur_flow;            u=neck;        }        for(i=curedge[u];i!=-1;i=next[i])        {            v=e[i].v;            if(e[i].f&&d[u]==d[v]+1)                break;        }        if(i!=-1)        {            curedge[u]=i;            pre[v]=u;            u=v;        }        else        {            if(0==--gap[d[u]])                break;            curedge[u]=first[u];            for(tmp=n+5,i=first[u];i!=-1;i=next[i])                if(e[i].f)                    tmp=min(tmp,d[e[i].v]);            d[u]=tmp+1;            ++gap[d[u]];            if(u!=s)                u=pre[u];        }    }    return flow_ans;}int map[100][100];void build(int mid){    int i,j;    memset(first,-1,sizeof(first));    memset(next,-1,sizeof(next));    memset(e,0,sizeof(e));    cc=0;    for(i=1;i<=n;i++)        add_edge(0,i,mid);    for(i=n+1;i<=n+m;i++)        add_edge(i,i+m,k);    for(i=n+m+1;i<=n+m+m;i++)        add_edge(i,n+m+m+1,mid);    for(i=1;i<=n;i++)    {        for(j=1;j<=m;j++)        {            if(map[i][j])                add_edge(i,n+m+j,1);            else                add_edge(i,n+j,1);        }    }}int main(){    int tt;    int cas;    scanf("%d",&tt);    for(cas=1;cas<=tt;cas++)    {        scanf("%d%d%d%d",&n,&m,&l,&k);        int i;        memset(map,0,sizeof(map));        for(i=0;i<l;i++)        {            int u,v;            scanf("%d%d",&u,&v);            map[u][v]=1;        }        int L=0,R=m,mid;        int ans=0;        while(L<=R)        {            mid=(L+R)/2;            build(mid);            int res=ISAP(0,n+m+m+1,n+m+m+1);            //printf("%d\n",res);            if(res==mid*n)            {                ans=mid;                L=mid+1;            }            else                R=mid-1;        }        printf("Case %d: %d\n",cas,ans);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.