Escape HDU
来源:互联网 发布:北京房价数据库 编辑:程序博客网 时间:2024/06/05 20:02
题目链接: Escape HDU - 3605
题目大意
n个人, m个星球(
思路
最大流
但是数据规模太大, 如果直接建图会超时
但是星球数量只有10个, 我们可以把人根据最每个星球的适应情况进行分类, 用二进制进行状态压缩, 这样最多分成
把每类人与其所能适应的星球连边, 容量为INF
S与每类人连边, 容量为这类人的人数
每个星球与T连边, 容量为星球容量
代码
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <map>using namespace std;const int MAXV = 3000, INF = 0X3F3F3F3F;struct edge{ int to, cap, rev; edge(int a, int b, int c) :to(a), cap(b), rev(c){}};vector<edge> G[MAXV];int iter[MAXV], level[MAXV], S, T;void add_edge(int from, int to, int cap){ G[from].push_back(edge(to, cap, G[to].size())); G[to].push_back(edge(from, 0, G[from].size()-1));}bool bfs(){ memset(level, -1, sizeof(level)); level[S] = 0; queue<int> que; que.push(S); while(!que.empty()) { int v = que.front(); que.pop(); for(int i=0; i<(int)G[v].size(); ++i) { edge &e = G[v][i]; if(e.cap>0 && level[e.to]==-1) { level[e.to] = level[v] + 1; que.push(e.to); } } } return level[T]!=-1;}int dfs(int v, int f){ if(v == T) return f; for(int &i=iter[v]; i<(int)G[v].size(); ++i) { edge &e = G[v][i]; if(e.cap>0 && level[e.to]>level[v]) { int d = dfs(e.to, min(f, e.cap)); if(d) { e.cap -= d; G[e.to][e.rev].cap+= d; return d; } } } return 0;}int max_flow(){ int flow = 0; while(bfs()) { memset(iter, 0, sizeof(iter)); int f; while((f=dfs(S, INF))) flow += f; } return flow;}void init(){ for(int i=0; i<MAXV; ++i) G[i].clear();}int n, m, a[1<<11], b[20];int main(){ while(scanf("%d%d", &n, &m) == 2) { memset(a, 0, sizeof(a)); for(int i=0; i<n; ++i) { int s = 0, x; for(int j=0; j<m; ++j) { scanf("%d", &x); if(x) s+=(1<<j); } a[s]++; } int nn = 1<<m; for(int i=0; i<m; ++i) scanf("%d", &b[i]); init(); S = nn + m; T = S + 1; for(int i=0; i<nn; ++i) { if(a[i]) { add_edge(S, i, a[i]); } for(int j=0; j<m; ++j) { if(i & (1<<j)) add_edge(i, j+nn, INF); } } for(int i=0; i<m; ++i) add_edge(i+nn, T, b[i]); if(n == max_flow()) puts("YES"); else puts("NO"); } return 0;}
阅读全文
0 0
- hdu Escape
- Escape HDU
- Escape HDU
- Escape HDU
- Escape HDU
- hdu 1733 Escape
- hdu 1733 Escape
- Hdu 3605 Escape
- Hdu 3605 Escape
- BFS-hdu-3533-Escape
- HDU 3533 Escape
- HDU 3533 Escape
- HDU - 2364 Escape
- HDU 2364 Escape
- HDU-3533-Escape(BFS)
- HDU 3605 Escape
- hdu Escape(bfs+模拟)
- hdu 5389 Zero Escape
- yii2.0利用yii2-swiftmailer扩展发送邮件
- 【知识库】--Dubbo ReferenceBean获取 -- 源码过程(254)
- LINUX2.6输入子系统设备模型分析
- INPUT设备输入事件的传递过程
- bootstrap-datepicker日历插件 与bootstrapValidator验证同时使用时无效
- Escape HDU
- jzoj 模拟赛总结(2017.07.08)
- 第六天,晚了
- CodeVS 3344 迷宫 题解
- 洛谷P3379 【模板】最近公共祖先(LCA)
- 9Patch图片
- HTML+CSS编写静态网站-30 课后作业06
- 服务器上下拉风格展现异常,无法点击问题解决方案
- bzoj 4776: [Usaco2017 Open]Modern Art 二维差分