1565: [NOI2009]植物大战僵尸

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 2317  Solved: 1071
[Submit][Status][Discuss]

Description

Input

Output

仅包含一个整数,表示可以获得的最大能源收入。注意,你也可以选择不进行任何攻击,这样能源收入为0。

Sample Input

3 2
10 0
20 0
-10 0
-5 1 0 0
100 1 2 1
100 0

Sample Output

25

HINT

在样例中, 植物P1,1可以攻击位置(0,0), P2, 0可以攻击位置(2,1)。 
一个方案为,首先进攻P1,1, P0,1,此时可以攻击P0,0 。共得到能源收益为(-5)+20+10 = 25。注意, 位置(2,1)被植物P2,0保护,所以无法攻击第2行中的任何植物。 
【大致数据规模】
约20%的数据满足1 ≤ N, M ≤ 5;
约40%的数据满足1 ≤ N, M ≤ 10;
约100%的数据满足1 ≤ N ≤ 20,1 ≤ M ≤ 30,-10000 ≤ Score ≤ 10000 。

Source

分析:

看到这题就觉得亲切,这不是最大权闭合子图么...被保护的点向保护它的点连边,然后就是裸的最大权闭合子图...

但是发现过不了样例...TAT...因为有环...

所以我们要要删掉环的点,并且如果环上的点不能选,那么指向它的点也不能选...怎么办?拓扑排序?

但是拓扑排序只能判断有没有环,不能判断点是否在环上...比如下面这张图...

但是很巧的是我们的图是所有指向环的点都不能选...所以反向所有边...拓扑排序无法访问到的点就是需要删掉的点...(WA了好久QAQ...感谢LMY...)

代码:

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<queue>
 6 //by NeighThorn
 7 #define inf 0x7fffffff
 8 using namespace std;
 9
10 const int maxn=700+5,maxm=2000000+5;
11
12 int n,m,S,T,cnt,ans,hd[maxn],fl[maxm],in[maxn],to[maxm],nxt[maxm],pos[maxn],val[maxn],vis[maxn],mp[maxn][maxn];
13
14 inline bool bfs(void){
15     memset(pos,-1,sizeof(pos));
16     int head=0,tail=0,q[maxn];
17     q[0]=S,pos[S]=0;
18     while(head<=tail){
19         int top=q[head++];
20         for(int i=hd[top];i!=-1;i=nxt[i])
21             if(pos[to[i]]==-1&&fl[i])
22                 pos[to[i]]=pos[top]+1,q[++tail]=to[i];
23     }
24     return pos[T]!=-1;
25 }
26
27 inline int find(int v,int f){
28     if(v==T)
29         return f;
30     int res=0,t;
31     for(int i=hd[v];i!=-1&&f>res;i=nxt[i])
32         if(pos[to[i]]==pos[v]+1&&fl[i])
33             t=find(to[i],min(fl[i],f-res)),fl[i]-=t,fl[i^1]+=t,res+=t;
34     if(!res)
35         pos[v]=-1;
36     return res;
37 }
38
39 inline int dinic(void){
40     int res=0,t;
41     while(bfs())
42         while(t=find(S,inf))
43             res+=t;
44     return res;
45 }
46
47 inline void topo(void){
48     queue<int> q;
49     for(int i=1;i<=n*m;i++)
50         if(!in[i])
51             q.push(i),vis[i]=1;
52     while(!q.empty()){
53         int top=q.front();q.pop();
54         for(int i=1;i<=n*m;i++)
55             if(mp[top][i]){
56                 in[i]-=mp[top][i];
57                 if(!in[i])
58                     q.push(i),vis[i]=1;
59             }
60     }
61 }
62
63 inline void add(int s,int x,int y){
64     fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
65     fl[cnt]=0;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
66 }
67
68 signed main(void){
69     // freopen("in.txt","r",stdin);
70     // freopen("out.txt","w",stdout);
71     memset(in,0,sizeof(in));
72     memset(hd,-1,sizeof(hd));
73     scanf("%d%d",&n,&m);T=n*m+1;
74     for(int i=1,s;i<=n*m;i++){
75         scanf("%d%d",&val[i],&s);
76         for(int j=1,x,y;j<=s;j++){
77             scanf("%d%d",&x,&y),x++,y++;
78             in[(x-1)*m+y]++;mp[i][(x-1)*m+y]++;
79         }
80         if(i%m)
81             in[i]++,mp[i+1][i]++;
82     }
83     topo();
84     for(int i=1;i<=n*m;i++)
85         if(vis[i]){
86             if(val[i]>0)
87                 ans+=val[i],add(val[i],S,i);
88             else
89                 add(-val[i],i,T);
90             for(int j=1;j<=n*m;j++)
91                 if(vis[j]&&mp[i][j])
92                     add(inf,j,i);
93         }
94     printf("%d\n",max(ans-dinic(),0));
95     return 0;
96 }//Cap ou pas cap. Cap.


By NeighThorn

转载于:https://www.cnblogs.com/neighthorn/p/6259621.html

BZOJ 1565: [NOI2009]植物大战僵尸相关推荐

  1. BZOJ 1565 [NOI2009]植物大战僵尸

    title: 'BZOJ 1565 [NOI2009]植物大战僵尸' categories: BZOJ date: 2016-3-20 9:30:00 tags: [最小割] Description ...

  2. 1565: [NOI2009]植物大战僵尸

    1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec   Memory Limit: 64 MB Submit: 2088   Solved: 976 [ Submit][ ...

  3. 洛谷P2805 [NOI2009] 植物大战僵尸

    [NOI2009]植物大战僵尸 题面 洛谷 题解 先扯一些无关的,最近怀旧重新玩了玩植物大战僵尸,然后发现打到夜晚池塘的时候矿工僵尸发现很难处理于是回来刷了刷题... 看到洛谷上正好有道植物大战僵尸就 ...

  4. [NOI2009] 植物大战僵尸

    [NOI2009] 植物大战僵尸 在n*m的地图当中,每个位置都有一个植物,每个植物有一个价值,这个价值可能是正数也可能是负数.每个植物可能有几个攻击的位置,只有在除掉这个植物之后才可以到那几个位置去 ...

  5. 网络流 - 最大权闭合子图 [NOI2009]植物大战僵尸

    算法思想概述 本题是一道最大权闭合子图模型,应用的算法为最大流(BFS增广即可),定理为最大流最小割定理,辅助算法为拓扑排序. 问题初始建模 首先我们我建立图论模型,把每个植物当做一个顶点,植物携带的 ...

  6. P2805 [NOI2009]植物大战僵尸

    总结 锅出的莫名其妙 首先是题目要求僵尸必须要从右边过来,也就是找拓扑序的时候必须要从每个点右边的点连一条边到这个点 然后是bfs的写法 如果这么写 int bfs(void){memset(vis, ...

  7. 女友让我破解植物大战僵尸!我干脆撸了一款一样的....翻身舔狗把歌唱呀

    今天给大家分享的开源项目可以说非常适合入门,还比较好玩,更是一个有故事的项目.既能满足想学习的读者,又能满足那些喜欢八卦的读者. 提到植物大战僵尸相信大部分读者都不陌生,可以说是塔防类游戏的鼻祖.就鸟 ...

  8. 【植物大战僵尸2】算法 笔记

    文章目录 春日活动--旅行原木--特殊事件--植物挑战_超能花菜 春日活动--暖春植树--初春挑战 地图解锁顺序建议 花园战争 超z联赛 无尽挑战 无尽常用植物及装扮 植物排名 春日活动–旅行原木–特 ...

  9. pvz安卓服务器维修礼包码,植物大战僵尸2礼包兑换码大全2020最新版

    植物大战僵尸2礼包码2020最新版是一款能够让玩家体验烧脑塔防大战的放置游戏,拥有经典的游戏规则设计,带来的玩法也会让每个玩家体验最为精彩的体验,每个僵尸都有着自己的特性,游戏之中的每一种植物都有自己 ...

  10. [日记]游长白遇梅花,植物大战僵尸

    "旅客朋友们--"我因为坐在面包车副驾驶的位置,所以假装自己是导游,"您即将经过的景点是'董眼镜修车铺',请向车窗的左侧观看--" 董眼镜修车铺 "董 ...

最新文章

  1. 技术图文:03 结构型设计模式(下)
  2. python的x 2是什么意思_python中startx是什么意思
  3. 关于html5和css3的新特性
  4. 数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...
  5. asp.net 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值...
  6. Python中文编码判别及转换
  7. 电子计算机诞生于1946年第几台,人类第一台电子计算机诞生于1946年2月
  8. python psutil替代_Python2.7 psutil模块
  9. 【感悟】本书书名无法描述本书内容(二)
  10. 遇到了火狐扩展全部丢失的问题
  11. U-he The Dark Zebra for Mac(预设合成器)
  12. 模拟电子技术基础(第四版)教材 电子版
  13. 阿里java编程规范试题_阿里java编码规范考试总结
  14. 黑马程序员_毕向东_Java基础视频教程第01天_20151010(六)
  15. windows 文件系统
  16. 电脑版微信多开,最详细教程没有之一
  17. 用GATK进行二代测序数据 SNP Calling 流程:(二)bwa比对和HaplotypeCaller 变异检测
  18. 2、ESP8266入门(AT模式)——烧录固件
  19. Mac 版ps cs6 破解
  20. 弹性盒子flex布局

热门文章

  1. hadoop 如何连beeline_impala为hadoop续命
  2. Unity脚本的生命周期
  3. 计算机主板电池,如何更换计算机主板电池
  4. linux中iso源码解压_Linux系统下iso文件的制作和解压以及加载
  5. CodeForces - 245H Palindromes区间dp_记忆化搜索
  6. Spring JdbcTemplate 模板剖析 之 常用 增删改查
  7. java冒泡排序菜鸟教程_排序算法总结 | 菜鸟教程
  8. 阶段3 3.SpringMVC·_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
  9. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_7 获取Servlet原生的API
  10. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍