POJ 3281 Dining(最大流)
2016-07-11 16:58
495 查看
题目链接:http://poj.org/problem?id=3281
题意:有一些牛每个牛都有自己喜欢吃的food和喜欢喝的drink,饲养员有一些种类的food和一些种类的drink,合理分配这些食物和饮料,使得能够同时得到自己喜欢的食物和饮料(只要一个食物和一个饮料)的牛的数量最多。并且一种饮料或食物只能分配给一头牛。
题解:要求牛的数量于是,将牛拆成两个点一条边,在边上加上容量。然后设置一个起点,连接所有food,容量设置为1,设置一个终点,连接到所有drink,容易设置为1,将每个牛和自己喜欢的食物和饮料连接, 从起点到终点求最大流。
代码:
题意:有一些牛每个牛都有自己喜欢吃的food和喜欢喝的drink,饲养员有一些种类的food和一些种类的drink,合理分配这些食物和饮料,使得能够同时得到自己喜欢的食物和饮料(只要一个食物和一个饮料)的牛的数量最多。并且一种饮料或食物只能分配给一头牛。
题解:要求牛的数量于是,将牛拆成两个点一条边,在边上加上容量。然后设置一个起点,连接所有food,容量设置为1,设置一个终点,连接到所有drink,容易设置为1,将每个牛和自己喜欢的食物和饮料连接, 从起点到终点求最大流。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> const int MAX=400+10; const int INF=0x3f3f3f3f; using namespace std; int flow[MAX][MAX],cap[MAX][MAX]; int res[MAX],pre[MAX]; int N; int EK(int s,int e) { int ans=0; queue<int> que; while(1) { memset(res,0,sizeof(res)); que.push(s); res[s]=INF; while(!que.empty()) { int u=que.front(); que.pop(); for(int v=0;v<N;v++) { if(!res[v]&&cap[u][v]>flow[u][v]) { pre[v]=u; que.push(v); res[v]=min(res[u],cap[u][v]-flow[u][v]); } } } if(res[e]==0) break; ans+=res[e]; for(int i=e;i!=s;i=pre[i]) { flow[pre[i]][i]+=res[e]; flow[i][pre[i]]-=res[e]; } } return ans; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int f,d,n; while(scanf("%d%d%d",&n,&f,&d)!=EOF) { memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); N=f+d+n*2+2; int s=0; int e=N-1; for(int i=1;i<=f;i++) cap[s][i]=1; for(int i=1;i<=d;i++) cap[f+n*2+i][e]=1; for(int i=1;i<=n;i++) { cap[f+i][f+n+i]=1; int fnum,dnum; scanf("%d%d",&fnum,&dnum); while(fnum--) { int food; scanf("%d",&food); cap[food][f+i]=1; } while(dnum--) { int drink; scanf("%d",&drink); cap[f+n+i][f+2*n+drink]=1; } } printf("%d\n",EK(0,N-1)); /* for(int i=1;i<=n;i++) { cout<<i<<":"; for(int j=1;j<=f;j++) { if(flow[j][f+i]==1) cout<<"food "<<j<<" "; } for(int j=1;j<=d;j++) { if(flow[f+n+i][j+f+2*n]==1) cout<<"drink "<<j<<endl; } }*/ } return 0; }
相关文章推荐
- 【网络流-最大流-Dinic-建模】POJ3281 Dining:Pascal 解法
- Ford_Fulkerson算法
- 重标记与前移算法
- 网络流之增广路算法
- Poj2638 网络流+最短路+二分答案
- BZOJ3275 Number (最小割)
- [笔记] 网络流-最大流 POJ-1273\HDU-4240
- 上下界网络流初探
- 最大流/二匹配
- Edmonds-Karp 最大流 hdu 1532 Drained Ditches
- 网络流_poj1273
- POJ 1273 Drainage Ditches 最大流 dinic
- 最大流之预流推进
- 最大流 : FordFulkerson 算法
- POJ1273-Drainage Ditches
- 【网络流】复杂的大门
- ACM/ICPC World Finals 2013 C Surely You Congest
- 北京集训队 2016 Day4 alarm
- 网络流算法整理
- 网络流最大流算法(ISAP算法及DINIC算法)