hdu 4292 Food 网络流
2015-12-04 10:04
513 查看
题目链接
给你f种食物, 以及每种食物的个数, d种饮料, 以及个数, n个人, 以及每个人可以接受的食物种类和饮料种类。 每个人必须得到一种食物和一种饮料。 问最后得到满足的人的个数。
因为一个人只能得到一种食物, 所以把人拆成两个点, 之间连一条权值为1的边。 建一个源点s, 汇点t, 每种食物向源点连边, 权值为食物的个数, 饮料向汇点连边, 权值为个数。 如果一个人可以接受某种饮料, u'就向饮料连一条权值为1的边; 如果一个人可以接受某种食物, 食物就向u连权值为1的边。
每次数组都要开的很大才可以过...........
给你f种食物, 以及每种食物的个数, d种饮料, 以及个数, n个人, 以及每个人可以接受的食物种类和饮料种类。 每个人必须得到一种食物和一种饮料。 问最后得到满足的人的个数。
因为一个人只能得到一种食物, 所以把人拆成两个点, 之间连一条权值为1的边。 建一个源点s, 汇点t, 每种食物向源点连边, 权值为食物的个数, 饮料向汇点连边, 权值为个数。 如果一个人可以接受某种饮料, u'就向饮料连一条权值为1的边; 如果一个人可以接受某种食物, 食物就向u连权值为1的边。
每次数组都要开的很大才可以过...........
#include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int maxn = 8e4+5; int head[maxn*4], s, t, num, q[maxn], dis[maxn]; struct node { int to, nextt, c; }e[maxn*4]; void init() { mem1(head); num = 0; } void add(int u, int v, int c) { e[num].to = v; e[num].nextt = head[u]; e[num].c = c; head[u] = num++; e[num].to = u; e[num].nextt = head[v]; e[num].c = 0; head[v] = num++; } int bfs() { int u, v, st = 0, ed = 0; mem(dis); dis[s] = 1; q[ed++] = s; while(st<ed) { u = q[st++]; for(int i = head[u]; ~i; i = e[i].nextt) { v = e[i].to; if(e[i].c&&!dis[v]) { dis[v] = dis[u]+1; if(v == t) return 1; q[ed++] = v; } } } return 0; } int dfs(int u, int limit) { if(u == t) return limit; int cost = 0; for(int i = head[u]; ~i; i = e[i].nextt) { int v = e[i].to; if(e[i].c&&dis[u] == dis[v]-1) { int tmp = dfs(v, min(limit-cost, e[i].c)); if(tmp>0) { e[i].c -= tmp; e[i^1].c += tmp; cost += tmp; if(cost == limit) break; } else { dis[v] = -1; } } } return cost; } int dinic() { int ans = 0; while(bfs()) { ans += dfs(s, inf); } return ans; } char c[205]; int main() { int n, f, d, x; while(cin>>n>>f>>d) { init(); s = 0, t = f+2*n+d+1; for(int i = 1; i<=f; i++) { scanf("%d", &x); add(s, i, x); } for(int i = 1; i<=d; i++) { scanf("%d", &x); add(f+2*n+i, t, x); } for(int k = 0; k<2; k++) { for(int i = 1; i<=n; i++) { scanf("%s", c); int len = strlen(c); for(int j = 0; j<len; j++) { if(c[j]=='Y') { if(k==0) { add(j+1, f+i, 1); } else { add(f+n+i, j+1+f+2*n, 1); } } } } } for(int i = 1; i<=n; i++) { add(i+f, i+n+f, 1); } int ans = dinic(); cout<<ans<<endl; } }
相关文章推荐
- 从Linux内核中获取TCP数据包到用户程序。
- 重霾锁城 数据中心如何应对空气污染?
- http://blog.163.com/zhaoyanping_1125/blog/static/20132915320120711355117/
- httpclient基础
- Android中获取网络图片的三种方法
- TCP,IP详解,卷一:协议学习笔记之第二章链路层
- 脉络清晰的BP神经网络讲解,赞
- 脉络清晰的BP神经网络讲解,赞
- HTTPS和HTTP的区别
- Nginx配置SSL证书部署HTTPS网站
- CNN网络提取哪层输出作为最后提取的特征为宜?
- iOS 网络与多线程--4.同步Post方式的网络请求
- 《TCP/IP详解 卷1:协议》 读书笔记 第九章 IP选路
- 忘记IP 大热“超级IP”才能大卖
- httpd.conf的配置
- <meta>标签中的name与http-equiv
- eclipse marketplace网络连接失败的解决方法
- iOS-网络处理
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- iOS 网络与多线程--3.异步Get方式的网络请求(非阻塞)