HDU 4309 Seikimatsu Occult Tonneru(网络流+枚举状态)

来源:互联网 发布:dota2多核优化启动项 编辑:程序博客网 时间:2024/05/23 13:06

由于桥最多只有12个,所以可以直接枚举修理那个桥,注意不修理的桥可以通过一个人,而且注意图中的边有方向,对于隧道,只可以其他点到隧道起始点再到隧道,所以可以从起始点向汇点连一条流量为容量的边,而其他边只需要连容量为无穷的边,然后最大流一下。

 Online JudgeOnline ExerciseOnline TeachingOnline ContestsExercise AuthorF.A.QHand In HandOnline AcmersForum | DiscussStatistical ChartsProblem ArchiveRealtime Judge StatusAuthors Ranklist      C/C++/Java Exams     ACM StepsGo to JobContest LiveCastICPC@ChinaSTD Contests VIP Contests Virtual Contests     DIY | Web-DIY betaRecent ContestsAuthor 宦成颖Mail Mail 0(0)Control Panel Control Panel Sign Out Sign Out7月22-8月21多校联合训练期间,会根据实际负载关闭部分模块,若有不便,请谅解~View CodeProblem : 4309 ( Seikimatsu Occult Tonneru )     Judge Status : AcceptedRunId : 11003913    Language : C++    Author : huanzhizun888Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta#include<iostream>#include<stdio.h>#include<memory.h>#include<cmath>#include<algorithm>using namespace std;#define MAXN 230#define MAXE 10010#define INF 1e9int tmp,source,des,cnt;int n,m;int x[MAXN];struct Edge{    int from, to;    int next,cap;}edge[MAXE];struct pi{    int no;    int to;    int cos;}pp[30];struct ppi{    int no;    int to;    int val;    int d;}pp1[1001];int head[MAXN];int gap[MAXN],dep[MAXN],cur[MAXN], stack[MAXN], top;int ISAP(){    int cur_fLow,max_fLow,u,insert,i;    memset(dep,0,sizeof(dep));    memset(gap,0,sizeof(gap));    memcpy(cur, head, n);    max_fLow = 0;    u = source;    top = 0;    while(dep[source] < n)    {        if(u == des)        {            cur_fLow = INF;            for(i = 0; i < top; ++i)            {                if(cur_fLow > edge[stack[i]].cap)                {                    insert = i;                    cur_fLow = edge[stack[i]].cap;                }            }            for(i = 0; i < top; ++i)            {                edge[stack[i]].cap -= cur_fLow;                edge[stack[i]^1].cap += cur_fLow;            }            max_fLow += cur_fLow;            u = edge[ stack[top = insert]].from;        }        for(i = cur[u]; i != -1; i = edge[i].next)            if((edge[i].cap > 0) && (dep[u] == dep[edge[i].to]+1))                break;        if(i != -1)        {            stack[top++] = i;            u = edge[i].to;        }        else        {            if(0 == --gap[dep[u]]) break;            int minn = n;            for(i = head[u]; i != -1; i = edge[i].next)            {                if(edge[i].cap > 0)                    minn = (minn > dep[edge[i].to]) ? (cur[u]= i, dep[edge[i].to]) : minn;            }            ++gap[dep[u] = minn + 1];            if(u != source) u = edge[stack[--top]].from;        }    }    return max_fLow;}void add(int u,int v,int f){    edge[cnt].next = head[u];    edge[cnt].from = u;    edge[cnt].to = v;    edge[cnt].cap = f;    head[u] = cnt++;    edge[cnt].next = head[v];    edge[cnt].from = v;    edge[cnt].to = u;    edge[cnt].cap = 0;    head[v] = cnt++;}int main(){    int i,j,p,k,tot,a,b,c,d,cal;    while(scanf("%d%d",&n,&m)!=EOF){        tot=0;        cnt=0;        cal=0;        for(i=1;i<=n;i++){            scanf("%d",&p);            x[i]=p;        }        for(i=0;i<m;i++){            scanf("%d%d%d%d",&a,&b,&c,&d);            if(d>0){                pp[tot].no=a;                pp[tot].to=b;                pp[tot].cos=c;                tot++;            }            else{                pp1[cal].no=a;                pp1[cal].to=b;                pp1[cal].val=c;                pp1[cal++].d=d;            }        }        k=1<<tot;        a=0;        b=INF;        for(i=0;i<k;i++){            cnt=0;            memset(head,-1,sizeof(head));            for(j=1;j<=n;j++){                add(0,j,x[j]);            }            for(j=0;j<cal;j++){                if(pp1[j].d<0){                    add(pp1[j].no,pp1[j].to,INF);                    add(pp1[j].no,n+1,pp1[j].val);                }                else{                    add(pp1[j].no,pp1[j].to,INF);            }        }            c=0;            for(j=0;j<tot;j++){                if(i&(1<<j)){                    add(pp[j].no,pp[j].to,INF);                    c+=pp[j].cos;                }                else{                    add(pp[j].no,pp[j].to,1);                }            }            source=0;            des=n+1;            d=ISAP();            if(d>a){                a=d;                b=c;            }            else if(d==a&&b>c){                b=c;            }        }        if(a==0){            printf("Poor Heaven Empire\n");        }        else{            printf("%d %d\n",a,b);        }    }    return 0;}[ Copy to Clipboard ]    [ Save to File]Home | Top Hangzhou Dianzi University Online Judge 3.0Copyright © 2005-2014 HDU ACM Team. All Rights Reserved.Designer & Developer : Wang Rongtao LinLe GaoJie GanLuTotal 0.001500(s) query 1, Server time : 2014-07-11 18:04:50, Gzip enabledAdministration


0 0
原创粉丝点击