HDU 5076 Memory
来源:互联网 发布:win7优化开机时间 编辑:程序博客网 时间:2024/06/03 05:23
昂神的解题报告:http://sd-invol.github.io/2014/10/22/Anshan-2014-G/
我来对他的话进行翻译就好了…
之所以看出最小割 是因为每个位置有两种方案 这样形成二分图后 我们要进行决策 最小割也就变成了进行决策所要丢掉的最小价值
之所以根据每个位置的二进制表示中1的个数来决定该位置两种决策放在左边还是右边 是为了避免二分图中同一个集合里的两个点连边
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<map>#include<set>#include<vector>#include<queue>#include<cstdlib>#include<ctime>#include<cmath>#include<bitset>using namespace std;#define N 300#define inf 50000000int T, S, n, m, tot, cas, ans;int head[N * 2], f[N], g[N], Less[N], Lid[N], More[N], Mid[N], dis[N * 2], qu[N* 2];struct edge {int v, w, next;} ed[N * N * 100];int cut(int x) {int i;for (i = 0; x; x -= (x & (-x)), i++);return i;}void add(int u, int v, int w) {ed[tot].v = v;ed[tot].w = w;ed[tot].next = head[u];head[u] = tot++;ed[tot].v = u;ed[tot].w = 0;ed[tot].next = head[v];head[v] = tot++;}bool bfs() {int l, r, u, v, i;memset(dis, -1, sizeof(dis));dis[S] = 0;qu[0] = S;l = 0;r = 1;while (l < r) {u = qu[l++];for (i = head[u]; ~i; i = ed[i].next) {v = ed[i].v;if (dis[v] < 0 && ed[i].w > 0) {dis[v] = dis[u] + 1;if (v == T)return true;qu[r++] = v;}}}return false;}int dfs(int u, int nowflow) {if (u == T)return nowflow;int i, v, tmp, res = 0;for (i = head[u]; ~i; i = ed[i].next) {v = ed[i].v;if (dis[v] == dis[u] + 1 && ed[i].w > 0) {tmp = dfs(v, min(nowflow, ed[i].w));nowflow -= tmp;ed[i].w -= tmp;ed[i ^ 1].w += tmp;res += tmp;if (!nowflow)break;}}if (!nowflow)dis[u] = -1;return res;}int main() {scanf("%d", &cas);while (cas--) {scanf("%d%d", &n, &m);n = 1 << n;m = 1 << m;tot = 0;memset(head, -1, sizeof(head));ans = 0;memset(Less, -1, sizeof(Less));memset(More, -1, sizeof(More));S = 0;T = n * 2 + 1;for (int i = 0; i < n; i++)scanf("%d", &f[i]);for (int i = 0; i < n; i++)scanf("%d", &g[i]);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {int k;scanf("%d", &k);k += 1024;if (j < f[i]) {if (Less[i] < k) {Less[i] = k;Lid[i] = j;}} else {if (More[i] < k) {More[i] = k;Mid[i] = j;}}}}for (int i = 0; i < n; i++) {int aa = cut(i);if (aa & 1) {add(S, i + 1, Less[i]);add(i + 1 + n, T, More[i]);} else {add(S, i + 1, More[i]);add(i + 1 + n, T, Less[i]);}add(i + 1, i + 1 + n, inf);for (int j = i + 1; j < n; j++) {if (cut(i ^ j) == 1) {if (aa & 1)add(i + 1, j + 1 + n, g[i] ^ g[j]);elseadd(j + 1, i + 1 + n, g[i] ^ g[j]);}}}while (bfs())ans += dfs(S, inf);for (int i = 0; i < n; i++) {if (i)printf(" ");int aa = cut(i);if (aa & 1) {if (dis[i + 1] != -1)printf("%d", Lid[i]);elseprintf("%d", Mid[i]);} else {if (dis[i + 1] != -1)printf("%d", Mid[i]);elseprintf("%d", Lid[i]);}}printf("\n");}return 0;}
1 0
- HDU 5076 Memory
- HDU 3007 Buried memory
- hdu 2871 Memory Control
- hdu 2871 Memory Control
- hdu 2871 Memory Control
- HDU 2871 Memory Control
- HDU-2871-Memory Control
- Buried memory(hdu 3007)
- hdu 2871 Memory Control
- HDU 2871 Memory Control
- HDU.3007 Buried memory
- HDU 3007:Buried memory
- acm hdu 3007 Buried memory
- hdu - 4345 - Memory Control - 数论
- 【23.68%】【hdu 2871】Memory Control
- hdu 5076 Memory(最小割 数学建模)智商被爆出翔
- hdu 2871 Memory Control 线段树
- 线段树 HDU 2871 memory control
- 如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
- opencv之级联分类器训练opencv_traincascade
- AeroWindow属性 myLib.desktop.win.newWin参数说明
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- Nginx的配置与部署(10)核心模块之HTTP模块Location相关指令
- HDU 5076 Memory
- codeforces 391f3 Stock Trading
- .net excel导入导出异常信息:检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
- C#中Dictionary的用法及用途
- 从View 里提取bitmap
- 银光类似web visio的节点连线控件Essential Diagram免费下载地址
- DB2(WITH AS)SQL递归查询
- hdu1978:How many ways
- mybatis 打印sql语句