poj 3281 Dining
来源:互联网 发布:淘宝刷单91lingla 编辑:程序博客网 时间:2024/06/05 15:31
原题链接:http://poj.org/problem?id=3281
最大流,拆点构图。
#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<map>using std::min;using std::sort;using std::pair;using std::swap;using std::queue;using std::vector;using std::multimap;#define pb(e) push_back(e)#define sz(c) (int)(c).size()#define mp(a, b) make_pair(a, b)#define all(c) (c).begin(), (c).end()#define iter(c) __typeof((c).begin())#define cls(arr, val) memset(arr, val, sizeof(arr))#define cpresent(c, e) (find(all(c), (e)) != (c).end())#define rep(i, n) for(int i = 1; i <= (int)n; i++)#define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)const int Max_N = 1100;const int INF = 0x3f3f3f3f;struct Ford_Fulkerson { struct edge { int to, cap, next, rev; }G[Max_N << 2]; int N, F, D, tot, head[Max_N]; bool vis[Max_N], Food[Max_N][Max_N], Drink[Max_N][Max_N]; inline void init(int n, int f, int d) { tot = 0; this->N = n, this->F = f, this->D =d; cls(head, -1), cls(Food, false), cls(Drink, false); } inline void add_edge(int u, int v, int cap = 1) { G[tot] = (edge){ v, cap, head[u], tot + 1 }; head[u] = tot++; G[tot] = (edge){ u, 0, head[v], tot - 1 }; head[v] = tot++; } inline void built() { int x, y, v; rep(i, N) { scanf("%d %d", &x, &y); while(x--) { scanf("%d", &v); Food[i][v] = true; } while(y--) { scanf("%d", &v); Drink[i][v] = true; } } } inline int dfs(int u, int t, int f) { if(u == t) return f; vis[u] = true; for(int i = head[u]; ~i; i = G[i].next) { edge &e = G[i]; if(e.cap > 0 && !vis[e.to]) { int d = dfs(e.to, t, min(e.cap, f)); if(d > 0) { e.cap -= d; G[e.rev].cap +=d; return d; } } } return 0; } inline void max_flow(int s, int t) { int flow = 0; while(true) { cls(vis, false); int f = dfs(s, t, INF); if(!f) break; flow += f; } printf("%d\n", flow); } inline void solve() { int s = 1, t = s + F + 2 * N + D + 1; rep(i, F) { add_edge(s, s + i); } rep(i, D) { add_edge(s + F + 2 * N + i, t); } rep(i, N) { add_edge(s + F + i, s + F + N + i, 1); rep(j, F) { if(Food[i][j]) add_edge(s + j, s + F + i); } rep(j, D) { if(Drink[i][j]) add_edge(s + F + N + i, s + F + 2 * N + j); } } max_flow(s, t); }}go;int main() {#ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout);#endif int n, f, d; while(~scanf("%d %d %d", &n, &f, &d)) { go.init(n ,f ,d); go.built(); go.solve(); } return 0;}
0 0
- poj 3281 Dining Maxflow
- POJ 3281 Dining
- poj 3281 Dining //SAP
- POJ 3281 Dining
- poj 3281 Dining
- poj 3281 Dining
- POJ 3281 Dining
- POJ 3281 Dining
- poj 3281 Dining
- POJ-3281-Dining
- poj(3281)Dining
- POJ 3281 Dining
- poj 3281 Dining
- poj 3281 Dining
- POJ 3281 Dining
- POJ 3281 Dining
- POJ 3281 Dining dinic
- POJ 3281 — Dining
- SSH服务器之间信任关系!/usr/bin/ssh-copy-id: ERROR: No identities found
- Spring 字符编码过滤
- C#项目关于程序中使用管理员权限的程序的打包,需要注意的事项
- 1161 -- 路径打印
- setTimeout的用法及注意点
- poj 3281 Dining
- 删除Openstack僵尸instances和projects(2)
- Hadoop入门进阶课程1--Hadoop1.X伪分布式安装
- Linux环境安装Mysql数据库的三种方式之一:二进制包方式安装
- 1162 -- 计算表达式
- python中的切片操作
- 关于出口(user-exit)MV50AFZ1的一些问题
- C++ Builder XE8 安卓开发之获取WIFI状态
- 《IOS_C语言》程序存储区划分、动态申请内存、内存操作函数