多校第16場 HDU3996 Gold Mine (最大權閉合圖)

來源:互聯網
上載者:User

 被資料範圍坑了。。。

構圖方法這裡講的很詳細

http://apps.hi.baidu.com/share/detail/18295127

和之前的一道題類似,

用總的正值和減去最小割,

 

#include <cstdio>#include <string.h>using namespace std;typedef long long ll;const int N=3550;const int M=9000000;const ll inf=13216546513113211ll;int head[N];struct Edge{    int v,next;    ll w;} edge[M];int cnt,s=0;void addedge(int u,int v,ll w)//這裡存的還是一條有向邊{    edge[cnt].v=v;    edge[cnt].w=w;    edge[cnt].next=head[u];    head[u]=cnt++;    edge[cnt].v=u;    edge[cnt].w=0;    edge[cnt].next=head[v];    head[v]=cnt++;}ll sap(int t){    int pre[N],cur[N],dis[N],gap[N];    ll flow=0,aug=inf,u;    bool flag;    for(int i=0; i<=t; i++){        cur[i]=head[i];        gap[i]=dis[i]=0;    }    gap[s]=t+1;    u=pre[s]=s;    while(dis[s]<=t){        flag=0;        for(int &j=cur[u]; ~j; j=edge[j].next){            int v=edge[j].v;            if(edge[j].w>0&&dis[u]==dis[v]+1){               flag=1;               if(edge[j].w<aug) aug=edge[j].w;               pre[v]=u;               u=v;               if(u==t){                    flow+=aug;                    //printf("%d\n",flow);                    while(u!=s){                       u=pre[u];                       edge[cur[u]].w-=aug;                       edge[cur[u]^1].w+=aug;//異或是找與其配對的邊                    }                    aug=inf;                }                break;            }        }        if(flag) continue;        int mindis=t+1;        for(int j=head[u]; ~j; j=edge[j].next){            int v=edge[j].v;            if(edge[j].w>0&&dis[v]<mindis){                mindis=dis[v];                cur[u]=j;            }        }        if((--gap[dis[u]])==0)            break;        gap[dis[u]=mindis+1]++;        u=pre[u];    }    return flow;}ll value[N];void init(){    memset (head , -1 , sizeof(head));    cnt=0;}int main (){    int cas;    int n,lay,c;    ll a,b;    ll sum=0;    int u,v;    scanf("%d",&cas);    for (int I=1 ; I<=cas ; ++I)    {        init();        sum=0;        scanf("%d",&lay);        for (int i=0 ; i<lay ; ++i)        {            scanf("%d",&n);            for (int j=0 ; j<n ; ++j)            {                scanf("%I64d%I64d%d",&a,&b,&c);                value[i*25+j+1]=b-a;                for (int k=0 ; k<c ; ++k)                {                    scanf("%d%d",&u,&v);                    u--;v--;                    addedge(i*25+j+1,u*25+v+1,inf);                }                if(value[i*25+j+1]>0)                    addedge(0,i*25+j+1,value[i*25+j+1]),sum+=value[i*25+j+1];                if(value[i*25+j+1]<0)                    addedge(i*25+j+1,2550,-value[i*25+j+1]);            }        }        ll  ans=sum-sap(2550);        //printf("%d\n",sum);        printf("Case #%d: %I64d\n",I,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.