hdu 4560 我是歌手

來源:互聯網
上載者:User
證:易得:舉辦1 場 的 流 是 n則如果 舉辦 d 場 的 流  < n* d 的話 說明 必定 中間 出現 了重複 (某條路沒有走)與 已知 每首 歌 的利用率 為 1 次 矛 盾 即 可以證明 如果 不滿足 滿流 一定 不 是 解 #include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#define min(a,b) (a)>(b)?(b):(a)#define max(a,b) (a)>(b)?(a):(b)#define inf 99999999using namespace std;int cnt;int source,N;int sink,ans;int c[4400];int hash[200][200];int H[12410];int d[4410];struct egde{    int u,v,c,next;};egde a[16000];void init(){    int i;    for(i=0;i<12000;i++)        H[i]=-1;    cnt=0;}void add(int u,int v,int c){    a[cnt].v=v;    a[cnt].c=c;    a[cnt].next=H[u];    H[u]=cnt++;}void build(int u,int v,int c){    add(u,v,c);    add(v,u,0);}int dfs(int u,int flow){    if(u==sink)        return flow;    int tt,res=0,delta;    for(tt=H[u];~tt;tt=a[tt].next)    {        int &v=a[tt].v,&c=a[tt].c;        if(c&&d[u]==d[v]+1){        delta=dfs(v,min(flow,c));        c-=delta;        a[tt^1].c+=delta;        res+=delta;        flow-=delta;        if (!flow)             return res;        }    }    if(!res)    {        if(!--c[d[u]])            d[source]=N+1;        ++c[++d[u]];    }    return res;}void sap(){    memset(c,0,sizeof(c));    memset(d,0,sizeof(d));    c[source]=N;    while(d[source]<N)        ans+=dfs(source,inf);}int main(){    int n,t,i,j,m,x,y,l,k;    int cas=1;    scanf("%d",&t);    while(t--)    {        int res=0;        scanf("%d%d%d%d",&n,&m,&l,&k);        memset(hash,0,sizeof(hash));        for(i=1;i<=l;i++)        {            scanf("%d%d",&x,&y);            hash[x][y]=1;//記錄相連狀況        }        source=0;        sink=n+2*m+1;        N=sink+1;        int l=0,r=m;        while(l<=r)        {            ans=0;            init();            for(i=1;i<=n;i++)                for(j=1;j<=m;j++)                {                    if(hash[i][j])                        build(i,j+n+m,1);//擅長                    else                        build(i,j+n,1);//不擅長                }            for(i=n+1;i<=(n+m);i++)                build(i,i+m,k);//拆點            int mid=(l+r)/2;            for(i=1;i<=n;i++)                build(source,i,mid);            for(i=n+m+1;i<=(n+2*m);i++)                build(i,sink,mid);            sap();            if(ans==mid*n)            {                res=mid;                l=mid+1;            }            else                r=mid-1;        }        printf("Case %d: %d\n",cas++,res);    }    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.