首页 > 代码库 > hdu4292 Food --- 最大流
hdu4292 Food --- 最大流
n个人,f种食物,d种饮料,各有一定数量,每个人对每种食物和饮料都有自己的喜好,必须要同时满足Y。
问至多能满足多少个人。
添加源点s,汇点t。
s到每种食物建边,边权为该类食物的数量。
根据每个人的喜好,将食物到人、人到饮料建边,边权为1。
每个人只能算满足一次,所以把人拆点,自己到自己连边,边权为1.
最后,每种饮料到t建边,边权为该类饮料的数量。
#include<cstdio> #include<vector> #include<cstring> #include<queue> #define maxn 1010 #define inf 0x3f3f3f3f using namespace std; struct node { int from,to,cap,flow; }; struct dinic { int n,m,s,t; vector<node> e; vector<int> g[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void init(int n) { e.clear(); for(int i=0;i<=n+2;i++) g[i].clear(); } void addedge(int a,int b,int c,int d) { e.push_back((node){a,b,c,0}); e.push_back((node){b,a,d,0}); m=e.size(); g[a].push_back(m-2); g[b].push_back(m-1); } bool bfs() { memset(vis,0,sizeof vis); queue<int> q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()) { int x=q.front();q.pop(); for(int i=0;i<g[x].size();i++) { node& ee=e[g[x][i]]; if(!vis[ee.to]&&ee.cap>ee.flow) { vis[ee.to]=1; d[ee.to]=d[x]+1; q.push(ee.to); } } } return vis[t]; } int dfs(int x,int a) { if(x==t||a==0) return a; int flow=0,f; for(int& i=cur[x];i<g[x].size();i++) { node& ee=e[g[x][i]]; if(d[x]+1==d[ee.to]&&(f=dfs(ee.to,min(a,ee.cap-ee.flow)))>0) { ee.flow+=f; e[g[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow; } int maxflow(int s,int t) { this->s=s; this->t=t; int flow=0; while(bfs()) { memset(cur,0,sizeof cur); flow+=dfs(s,inf); } return flow; } }; dinic solve; int main() { int i,j,a,n,f,d,s,t; char str[210]; while(~scanf("%d%d%d",&n,&f,&d)) { s=0,t=f+n+n+d+1; solve.init(t); for(i=1;i<=f;i++) { scanf("%d",&a); solve.addedge(s,i,a,0); } for(i=f+1;i<=f+n;i++) solve.addedge(i,i+n,1,0); for(i=1;i<=d;i++) { scanf("%d",&a); solve.addedge(i+n+n+f,t,a,0); } for(i=1;i<=n;i++) { scanf("%s",str); for(j=1;j<=f;j++) if(str[j-1]=='Y') solve.addedge(j,f+i,1,0); } for(i=1;i<=n;i++) { scanf("%s",str); for(j=1;j<=d;j++) if(str[j-1]=='Y') solve.addedge(f+n+i,f+n+n+j,1,0); } printf("%d\n",solve.maxflow(s,t)); } return 0; }
hdu4292 Food --- 最大流
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。