您的位置:首页 > 理论基础 > 计算机网络

HDU 4292 Food [网络流]

2012-09-20 07:25 309 查看
  据说也是原题,N个人,F种食物,D种饮料,每种食物和饮料都有一定的数量,而每个人都有自己喜欢的食物和饮料,当一个人拿到自己喜欢的食物之一以及喜欢的饮料之一时,这个人能够被满足。求最多能满足多少人。

  看到题就觉得是网络流,但一时没想到怎么建图,斌牛一看题就说是原题,然后啪啪啪敲完键盘就过了。。

  食物放左边,饮料放右边,人放在中间,拆成两个点,点间流量为一,然后左点连喜欢的食物,右点连喜欢的饮料,再加个源点和汇点,做一遍网络流就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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: