HDU 4292 Food [网络流]
2012-09-20 07:25
309 查看
据说也是原题,N个人,F种食物,D种饮料,每种食物和饮料都有一定的数量,而每个人都有自己喜欢的食物和饮料,当一个人拿到自己喜欢的食物之一以及喜欢的饮料之一时,这个人能够被满足。求最多能满足多少人。
看到题就觉得是网络流,但一时没想到怎么建图,斌牛一看题就说是原题,然后啪啪啪敲完键盘就过了。。
食物放左边,饮料放右边,人放在中间,拆成两个点,点间流量为一,然后左点连喜欢的食物,右点连喜欢的饮料,再加个源点和汇点,做一遍网络流就OK了。。
看到题就觉得是网络流,但一时没想到怎么建图,斌牛一看题就说是原题,然后啪啪啪敲完键盘就过了。。
食物放左边,饮料放右边,人放在中间,拆成两个点,点间流量为一,然后左点连喜欢的食物,右点连喜欢的饮料,再加个源点和汇点,做一遍网络流就OK了。。
#include <string.h> #include <stdio.h> #include <algorithm> #define MAXN 1000 #define MAXE 1000000 #define INF 0x3f3f3f3f struct edge{ int v,e,n,flow; }e[MAXE]; int first[MAXN],es; int work[MAXN],q[MAXN],d[MAXN],front,rear; void addedge(int u,int v,int flow){ e[es].v=v,e[es].flow=flow,e[es].n=first[u],first[u]=es++; } int bfs(int s,int t,int n){ memset(d,-1,sizeof(d[0])*(n+1)); q[front=rear=d[s]=0]=s,rear++; while(front<rear){ int u=q[front++]; for(int i=first[u];i!=-1;i=e[i].n) if(e[i].flow&&d[e[i].v]==-1){ d[e[i].v]=d[u]+1,q[rear++]=e[i].v; if(e[i].v==t)return 1; } } return 0; } int dfs(int cur,int t,int res){ if(cur==t)return res; for(int &i=work[cur];i!=-1;i=e[i].n) if(e[i].flow&&d[e[i].v]==d[cur]+1) if(int tmp=dfs(e[i].v,t,std::min(res,e[i].flow))){ e[i].flow-=tmp,e[i^1].flow+=tmp; return tmp; } return 0; } int dinic(int s,int t,int n){ int ans=0,tt; while(bfs(s,t,n)){ memcpy(work,first,sizeof(first[0])*(n+1)); while(tt=dfs(s,t,INF))ans+=tt; } return ans; } int n,ds,fs,ff[205],dd[205]; char s[205]; int main(){ //freopen("test.in","r",stdin); while(scanf("%d%d%d",&n,&fs,&ds)!=EOF){ memset(first,-1,sizeof first);es=0; for(int i=1;i<=n;i++){ addedge(i<<1,i<<1|1,1); addedge(i<<1|1,i<<1,0); } int bf=n*2+2,bd=bf+fs,ss=0,tt=bf; for(int i=1;i<=fs;i++){ scanf("%d",&ff[i]); addedge(ss,bf+i,ff[i]); addedge(bf+i,ss,0); } for(int i=1;i<=ds;i++){ scanf("%d",&dd[i]); addedge(bd+i,tt,dd[i]); addedge(tt,bd+i,0); } for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=strlen(s+1);j++){ if(s[j]=='Y'){ addedge(bf+j,i<<1,INF); addedge(i<<1,bf+j,0); } } } for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=strlen(s+1);j++){ if(s[j]=='Y'){ addedge(i<<1|1,bd+j,INF); addedge(bd+j,i<<1|1,0); } } } printf("%d\n",dinic(ss,tt,bd+ds+1)); } return 0; }
相关文章推荐
- HDU 4292 Food (网络流,最大流)
- HDU 4292 Food 网络流建图
- HDU-4292 Food 简单网络流
- HDU 4292 Food(网络流) #by zh
- HDU 4292 网络流 Food
- HDU 4292 FOOD 网络流
- HDU 4292 Food 网络流最大流 拆点
- hdu 4292 Food 网络流
- hdu 4292 Food【拆点网络流】
- HDU 4292 Food 图论,网络流,建模
- Food (hdu 4292 网络流sap模板题)
- hdu 4292 Food 【图论-网络流-最大流-Dinic】
- hdu 4292(网络流)Food
- Hdu 4292 Food (2012成都赛区网络赛第五题,拆点网络流)
- HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)
- hdu 4292 Food 最大流+拆点
- HDU-4292 Food 三分图
- HDU 4292 Food(dinic +拆点)
- hdu 4292 Food
- HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online