4823: [Cqoi2017]老C的方块

题意:

鬼畜方块游戏不解释...

有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价。


比较明显的最小割,一个图形中必须删掉一个方块。

我的想法是方块拆点然后用INF连起来。


但是你不能随便连啊,否则可能会出现一些原来没有的限制。

要找到一个连边的顺序!也就是如何分层


画一画发现是可以做到的,然后建图就行了。

我是一层一层建的...


然后一开始忘记考虑一种图形WA了两次...

总共花了3个多小时...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <map>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = 2e5+5, M = 2e6+5, INF = 1e9+5;
  9. inline int read() {
  10. char c=getchar(); int x=0,f=1;
  11. while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
  12. while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
  13. return x*f;
  14. }
  15. int m, n, k, s, t;
  16. struct meow{int x, y, w;} a[N];
  17. map<int, int> g[100005];
  18. struct edge{int v, ne, c, f;} e[M];
  19. int cnt=1, h[N];
  20. inline void ins(int u, int v, int c) {
  21. e[++cnt] = (edge){v, h[u], c, 0}; h[u] = cnt;
  22. e[++cnt] = (edge){u, h[v], 0, 0}; h[v] = cnt;
  23. }
  24. int start(int x, int y) {
  25. if((x-2)%4 == 0) {
  26. if(!(y&1)) return 1;
  27. else return 0;
  28. }
  29. if((x+1)%4 == 0) {
  30. if(y&1) return 2;
  31. else return 0;
  32. }
  33. return 0;
  34. }
  35. inline void link(int u, int v) { ins(u+k, v, INF); }
  36. int t1[N], t2[N];
  37. void build() {
  38. s = 0; t = k+k+1;
  39. for(int i=1; i<=k; i++) ins(i, i+k, a[i].w);
  40. int v;
  41. int *mark = t1, *mark2 = t2;
  42. for(int i=1; i<=k; i++) {
  43. int x = a[i].x, y = a[i].y, p = start(x, y);
  44. if(!p) continue;
  45. ins(s, i, INF); //printf("start (%d, %d) %d\n", x, y, p);
  46. if(p == 1) {
  47. if(g[x].count(y+1)) v = g[x][y+1], link(i, v), mark[v] = 1;
  48. if(g[x].count(y-1)) v = g[x][y-1], link(i, v), mark[v] = 1;
  49. if(g[x+1].count(y)) v = g[x+1][y], link(i, v), mark[v] = 2;
  50. } else {
  51. if(g[x].count(y+1)) v = g[x][y+1], link(i, v), mark[v] = 2;
  52. if(g[x].count(y-1)) v = g[x][y-1], link(i, v), mark[v] = 2;
  53. if(g[x-1].count(y)) v = g[x-1][y], link(i, v), mark[v] = 1;
  54. }
  55. }
  56. swap(mark, mark2);
  57. for(int i=1; i<=k; i++) if(mark2[i]) {
  58. int x = a[i].x, y = a[i].y, p = mark2[i]; mark2[i] = 0;
  59. if(p == 1 && g[x-1].count(y)) v = g[x-1][y], link(i, v), mark[v] = 1;
  60. if(p == 2 && g[x+1].count(y)) v = g[x+1][y], link(i, v), mark[v] = 2;
  61. }
  62. swap(mark, mark2);
  63. for(int i=1; i<=k; i++) if(mark2[i]) {
  64. int x = a[i].x, y = a[i].y, p = mark2[i]; mark2[i] = 0;
  65. if(g[x].count(y+1)) v = g[x][y+1], link(i, v), mark[v] = 1;
  66. if(g[x].count(y-1)) v = g[x][y-1], link(i, v), mark[v] = 1;
  67. if(p == 1 && g[x-1].count(y)) v = g[x-1][y], link(i, v), mark[v] = 1;
  68. if(p == 2 && g[x+1].count(y)) v = g[x+1][y], link(i, v), mark[v] = 1;
  69. }
  70. for(int i=1; i<=k; i++) if(mark[i]) ins(i+k, t, INF);
  71. }
  72. namespace mf {
  73. int q[N], head, tail, vis[N], d[N];
  74. bool bfs() {
  75. memset(vis, 0, sizeof(vis));
  76. head = tail = 1;
  77. q[tail++] = s; d[s] = 0; vis[s] = 1;
  78. while(head != tail) {
  79. int u = q[head++];
  80. for(int i=h[u];i;i=e[i].ne)
  81. if(!vis[e[i].v] && e[i].c > e[i].f) {
  82. int v = e[i].v;
  83. vis[v] = 1; d[v] = d[u]+1;
  84. q[tail++] = v;
  85. if(v == t) return true;
  86. }
  87. }
  88. return false;
  89. }
  90. int cur[N];
  91. int dfs(int u, int a) {
  92. if(u == t || a == 0) return a;
  93. int flow = 0, f;
  94. for(int &i=cur[u];i;i=e[i].ne)
  95. if(d[e[i].v] == d[u]+1 && (f = dfs(e[i].v, min(a, e[i].c - e[i].f)) ) >0 ) {
  96. flow += f;
  97. e[i].f += f;
  98. e[i^1].f -= f;
  99. a -= f;
  100. if(a == 0) break;
  101. }
  102. if(a) d[u] = -1;
  103. return flow;
  104. }
  105. int dinic() {
  106. int flow = 0;
  107. while(bfs()) {
  108. for(int i=s; i<=t; i++) cur[i] = h[i];
  109. flow += dfs(s, INF);
  110. }
  111. return flow;
  112. }
  113. }
  114. int main() {
  115. freopen("in", "r", stdin);
  116. m=read(); n=read(); k=read();
  117. for(int i=1; i<=k; i++) a[i].x = read(), a[i].y = read(), a[i].w = read(), g[a[i].x][a[i].y] = i;
  118. build();
  119. int ans = mf::dinic();
  120. printf("%d\n", ans);
  121. }

bzoj 4823: [Cqoi2017]老C的方块 [最小割]的更多相关文章

  1. bzoj4823: [Cqoi2017]老C的方块(最小割)

    4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强   黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...

  2. BZOJ 4823: [Cqoi2017]老C的方块

    分析: 我觉得我的网络流白学了...QAQ... 其实数据范围本是无法用网络流跑过去的,然而出题者想让他跑过去,也就跑过去了... 看到题目其实感觉很麻烦,不知道从哪里入手,那么仔细观察所给出的有用信 ...

  3. bzoj 4823 [Cqoi2017]老C的方块——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...

  4. BZOJ 4823 [Cqoi2017]老C的方块 ——网络流

    lrd的题解:http://www.cnblogs.com/liu-runda/p/6695139.html 我还是太菜了.以后遇到这种题目应该分析分析性质的. 网络流复杂度真是$O(玄学)$ #in ...

  5. bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】

    参考:https://www.cnblogs.com/neighthorn/p/6705785.html 并不是黑白染色而是三色染色(还有四色的,不过是一个意思 仔细观察一下不合法情况,可以发现都是特 ...

  6. bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...

  7. 【BZOJ4823】[CQOI2017]老C的方块(网络流)

    [BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...

  8. BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)

    题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...

  9. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

随机推荐

  1. c++只能编译无法运行或许缺少命令

    -mwindows -lcomctl32 -lwinmm -lws2_32 -lodbc32 -lmysql   -lwinspool1.工具-编译选项-编译器-在连接器命令行加入以下命令:-mwin ...

  2. SPI、I2C、UART(转)

    UART与USART(转) UART需要固定的波特率,就是说两位数据的间隔要相等. UART总线是异步串口,一般由波特率产生器(产生的波特率等于传输波特率的16倍).UART接收器.UART发送器组成 ...

  3. 从零开始学习前端开发 — 15、CSS3过渡、动画

    一.css3过渡 语法: transition: 过渡属性 过渡时间 延迟时间 过渡方式; 1.过渡属性(transition-property) 取值:all 所有发生变化的css属性都添加过渡 e ...

  4. tp5 点击刷新验证码

    <form action="<{:url('index/index/login')}>" method="post" name="f ...

  5. OKMX6Q libx264交叉编译

    最开始使用的是最新版x264-snapshot-20171119-2245 配置使用: ./configure --host=arm-linux --cross-prefix=arm-linux- - ...

  6. JAR包介绍大全用途作用详解JAVA

    jta.jar 标准JTA API必要commons-collections.jar 集合类 必要antlr.jar  ANother Tool for Language Recognition 必要 ...

  7. struts配置json需要的jar包

  8. html5移动端meta自动适应标签

    控制显示区域各种属性: <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sc ...

  9. RocketMQ环境搭建(双master双slave模式)

    1.环境准备: 准备四台主机(我这里用CentOSx64) 主机 角色 broker 192.168.192.130 Master1 BrokerServerA 192.168.192.131 Mas ...

  10. linux_思想

    linux有哪些重要的思想? 1. 做的越多错的越多 2. 纸包不住火 3. 操作重要文件前备份,操作后查看结果 4. 看到命令输出结果,可能命令有个选择直接获得对应值 5. 先定行,再定列