图中的保护关系就类似于最大权闭合子图。即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边。那么题目就转化成了最大权闭合子图的问题。

但是这个图有点特殊啊。。。 考虑有环的情况,显然这个环以及指向这个环的点都不能选。

所以还要把这个图的反图进行一遍拓扑排序,这样忽略掉了这些点了。。。

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <set>
  10. # include <cmath>
  11. # include <algorithm>
  12. using namespace std;
  13. # define lowbit(x) ((x)&(-x))
  14. # define pi acos(-1.0)
  15. # define eps 1e-
  16. # define MOD
  17. # define INF
  18. # define mem(a,b) memset(a,b,sizeof(a))
  19. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  20. # define FO(i,a,n) for(int i=a; i<n; ++i)
  21. # define bug puts("H");
  22. # define lch p<<,l,mid
  23. # define rch p<<|,mid+,r
  24. # define mp make_pair
  25. # define pb push_back
  26. typedef pair<int,int> PII;
  27. typedef vector<int> VI;
  28. # pragma comment(linker, "/STACK:1024000000,1024000000")
  29. typedef long long LL;
  30. int Scan() {
  31. int x=,f=;char ch=getchar();
  32. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  33. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  34. return x*f;
  35. }
  36. void Out(int a) {
  37. if(a<) {putchar('-'); a=-a;}
  38. if(a>=) Out(a/);
  39. putchar(a%+'');
  40. }
  41. const int N=;
  42. //Code begin...
  43.  
  44. struct Edge{int p, next, w;}edge[N*N];
  45. int head[N], cnt=, cost[N], dee[N], n, m, s, t, vis[N];
  46. bool mark[N];
  47. queue<int>Q;
  48. vector<PII> E[N];
  49.  
  50. void add_edge(int u, int v, int w){
  51. edge[cnt].p=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++;
  52. edge[cnt].p=u; edge[cnt].w=; edge[cnt].next=head[v]; head[v]=cnt++;
  53. }
  54. int bfs(){
  55. int i, v;
  56. mem(vis,-);
  57. vis[s]=; Q.push(s);
  58. while (!Q.empty()) {
  59. v=Q.front(); Q.pop();
  60. for (i=head[v]; i; i=edge[i].next) {
  61. if (edge[i].w> && vis[edge[i].p]==-) {
  62. vis[edge[i].p]=vis[v] + ;
  63. Q.push(edge[i].p);
  64. }
  65. }
  66. }
  67. return vis[t]!=-;
  68. }
  69. int dfs(int x, int low){
  70. int i, a, temp=low;
  71. if (x==t) return low;
  72. for (i=head[x]; i; i=edge[i].next) {
  73. if (edge[i].w> && vis[edge[i].p]==vis[x]+){
  74. a=dfs(edge[i].p,min(edge[i].w,temp));
  75. temp-=a; edge[i].w-=a; edge[i^].w += a;
  76. if (temp==) break;
  77. }
  78. }
  79. if (temp==low) vis[x]=-;
  80. return low-temp;
  81. }
  82. void Topsort(){
  83. FO(i,,n*m) if (!dee[i]) Q.push(i), mark[i]=true;
  84. while (!Q.empty()) {
  85. int u=Q.front(); Q.pop();
  86. FO(i,,E[u].size()) {
  87. PII v=E[u][i];
  88. if (!v.second) continue;
  89. --dee[v.first];
  90. if (!dee[v.first]) Q.push(v.first), mark[v.first]=true;
  91. }
  92. }
  93. }
  94. int main ()
  95. {
  96. int T, x, y, res=, tmp, sum=;
  97. scanf("%d%d",&n,&m); s=n*m; t=n*m+;
  98. FO(i,,n) FO(j,,m) {
  99. scanf("%d%d",&cost[i*m+j],&T);
  100. while (T--) {
  101. scanf("%d%d",&x,&y); E[x*m+y].pb(mp(i*m+j,));
  102. E[i*m+j].pb(mp(x*m+y,)); ++dee[x*m+y];
  103. }
  104. }
  105. FO(i,,n) FO(j,,m-) FO(k,j+,m) E[i*m+j].pb(mp(i*m+k,)), E[i*m+k].pb(mp(i*m+j,)), ++dee[i*m+j];
  106. Topsort();
  107. FO(i,,n*m) {
  108. if (!mark[i]) continue;
  109. if (cost[i]>=) res+=cost[i], add_edge(s,i,cost[i]);
  110. else add_edge(i,t,-cost[i]);
  111. FO(j,,E[i].size()) {
  112. PII v=E[i][j];
  113. if (v.second||!mark[v.first]) continue;
  114. add_edge(i,v.first,INF);
  115. }
  116. }
  117. while (bfs()) while (tmp=dfs(s,INF)) sum+=tmp;
  118. printf("%d\n",res-sum);
  119. return ;
  120. }

BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)的更多相关文章

  1. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  2. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...

  3. BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...

  4. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】

    一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...

  5. 洛谷 - P2805 - 植物大战僵尸 - 最大流 - 最大权闭合子图

    https://www.luogu.org/problemnew/show/P2805 最大权闭合子图的特点是,假如你要选一个结点,则要先选中它的所有子节点.正权连S负权连T,容量为绝对值,原图有向边 ...

  6. BZOJ 1565 植物大战僵尸(最大权闭合图)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: ...

  7. BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流

    题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...

  8. 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1972  Solved: 917[Submit][Statu ...

  9. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

    链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...

随机推荐

  1. 20155339 2016-2017-2 《Java程序设计》第1周学习总结

    20155339 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 一直以为JAVA应该只是一种语言,研读了书本之后发现原来JAVA也代表了解决问题的平 ...

  2. RegExp,实现匹配合法邮箱(英文邮箱)的正则表达式

    邮箱列表:@qq.com.@vip.qq.com.@foxmail.com,数字邮箱暂时不考虑 以下邮箱列表用于测试: lihaha@qq.com lihaha@vip.qq.com lihaha@f ...

  3. ElasticSearch 聚合查询百分比

    这里用的是es5.6.9 bucket_script :它执行一个脚本,该脚本可以对多桶聚合中的指定度量执行每桶计算,指定的度量标准必须为数字,并且脚本必须返回数值. 官方语法 https://www ...

  4. python 内置模块(sys)

    sys.argv           命令行参数List,第一个元素是程序本身路径sys.exit(n)        退出程序,正常退出时exit(0)sys.version        获取Py ...

  5. 搜索引擎ElasticSearch系列(三): ElasticSearch2.4.4 bigdesk插件安装

    一:ElasticSearch bigdesk插件简介 bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况, ...

  6. [转]WIN2008 IIS7的日期格式

    最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...

  7. ESP8266 NON-OS SDK 和 RTOS SDK实现GPIO中断不同点

    ESP8266 Non-OS SDK 和 RTOS SDK 实现GPIO的方法稍有不同: 对于 Non-OS SDK,比如需要把 MTDO 配置成输入,同时下降沿触发中断: gpio_init(voi ...

  8. Openwrt能用的花生壳客户端

    http://files.cnblogs.com/mazhiyong/phddns.zip 使用教程可参考官方文档 http://service.oray.com/question/116.html

  9. [转]git学习------>git-rev-parse命令初识

    git学习------>git-rev-parse命令初识 2017年06月13日 10:04:13 阅读数:2172 一.准备工作 第一步:在d盘git test目录下,新建工作区根目录dem ...

  10. Lua学习笔记(7): 模块

    模块 模块就像是c语言工程项目目录里的.h.c文件或外部依赖项,为某一个文件的代码提供依赖,其实就是把工作分成几个模块,方便项目的管理,提高开发效率和维护效率 在Lua中,模块其实就是一个表,实现方式 ...