HDU 4292 Food(最大流)
2012-09-21 15:33
274 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292
题意:有F种饮料、D种食物。每种饮料可以满足fi个人,每种食物可以满足di个人。有n个人,每个人得到一个饮料和一个食物才算这个人的要求被满足。给出每个人想要得到的饮料和想要得到的食物。求最多被满足的人?
思路:题目给出的限制有以下几个:
(1)食物、饮料都可以提供给有限个人;
(2)每个人最多只能得到一个饮料和一个食物;
(3)每个人饮料和食物都得到一个才算满足。
针对以上要求:
(1)将源点s和每种饮料连边,容量为fi;将每种食物和汇点连边,容量为di;
(2)将人拆点,容量为1;
(3)将食物和饮料分别跟人连边,容量1.
这样就建完图了,感觉很巧妙啊。。。
题意:有F种饮料、D种食物。每种饮料可以满足fi个人,每种食物可以满足di个人。有n个人,每个人得到一个饮料和一个食物才算这个人的要求被满足。给出每个人想要得到的饮料和想要得到的食物。求最多被满足的人?
思路:题目给出的限制有以下几个:
(1)食物、饮料都可以提供给有限个人;
(2)每个人最多只能得到一个饮料和一个食物;
(3)每个人饮料和食物都得到一个才算满足。
针对以上要求:
(1)将源点s和每种饮料连边,容量为fi;将每种食物和汇点连边,容量为di;
(2)将人拆点,容量为1;
(3)将食物和饮料分别跟人连边,容量1.
这样就建完图了,感觉很巧妙啊。。。
#include <iostream> #include <cstdio> #include <cstring> #define min(x,y) ((x)<(y)?(x):(y)) using namespace std; struct Node { int v,cap,flow,next; Node(){} Node(int _v,int _cap,int _next) { v=_v; cap=_cap; next=_next; } }; const int INF=1000000000; const int M=100005; int num[M],h[M],curedge[M],pre[M]; int queue[M]; Node edges[1200005]; int n,m,s,t,head[M],e; void Add(int u,int v,int cap) { edges[e]=Node(v,cap,head[u]); head[u]=e++; edges[e]=Node(u,0,head[v]); head[v]=e++; } void BFS(int s,int t) { memset(num,0,sizeof(num)); memset(h,-1,sizeof(h)); num[0]=1; int front=0,rear=0; h[t]=0; queue[rear++]=t; int u,v,i; while(front!=rear) { u=queue[front++]; front=front%M; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; if(edges[i].cap!=0||h[v]!=-1) continue; queue[rear++]=v; rear=rear%M; ++num[h[v]=h[u]+1]; } } } int Maxflow(int s,int t,int n) { int ans=0,i,k,x,d,u; BFS(s,t); for(i=0;i<=n;i++) curedge[i]=head[i]; num =n;u=s; while(h[u]<n) { if(u==t) { d=INF+1; for(i=s;i!=t;i=edges[curedge[i]].v) if(d>edges[curedge[i]].cap) k=i,d=edges[curedge[i]].cap; for(i=s;i!=t;i=edges[curedge[i]].v) { x=curedge[i]; edges[x].cap-=d; edges[x^1].cap+=d; } ans+=d;u=k; } for(i=curedge[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[u]==h[edges[i].v]+1) break; if(i!=-1) { curedge[u]=i; pre[edges[i].v]=u; u=edges[i].v; } else { if(--num[h[u]]==0) break; curedge[u]=head[u]; for(x=n,i=head[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[edges[i].v]<x) x=h[edges[i].v]; h[u]=x+1;num[h[u]]++; if(u!=s) u=pre[u]; } } return ans; } int f,d; void InPut() { memset(head,-1,sizeof(head)); e=0; int i,j,x; s=0,t=1101; for(i=1;i<=f;i++) { scanf("%d",&x); Add(s,i,x); } for(i=1;i<=d;i++) { scanf("%d",&x); Add(n+n+f+i,t,x); } for(i=1;i<=n;i++) Add(f+i,n+f+i,1); char str[205]; for(i=1;i<=n;i++) { scanf("%s",str+1); for(j=1;str[j]!='\0';j++) if(str[j]=='Y') Add(j,f+i,1); } for(i=1;i<=n;i++) { scanf("%s",str+1); for(j=1;str[j]!='\0';j++) if(str[j]=='Y') Add(n+f+i,n+n+f+j,1); } } int main() { while(scanf("%d%d%d",&n,&f,&d)!=EOF) { InPut(); printf("%d\n",Maxflow(s,t,t)); } return 0; }
相关文章推荐
- 【最大流】HDU 4292 Food
- hdu 4292 Food 【图论-网络流-最大流-Dinic】
- HDU 4292 Food 最大流
- HDU 4292 Food(最大流)
- hdu 4292 Food 最大流
- HDU 4292--Food【最大流 && 拆点】
- hdu 4292 Food 最大流+拆点
- 拆点最大流-HDU-4292-Food
- HDU 4292 Food(最大流)
- Hdu 4292 Food.cpp 最大流+拆点
- HDU 4292 —— Food(最大流,拆点)
- hdu 4292 Food (最大流)
- 【HDU】4292 Food 最大流
- hdu 4292 Food 最大流
- hdu 4292 Food (成都赛区 网络赛 最大流 )
- POJ 3281 Dining & HDU 4292 Food【最大流】
- hdu 4292 Food 最大流
- HDU 4292 Food(建图+最大流)
- HDU 4292 Food (网络流,最大流)
- hdu 4292 Food (最大流)