BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)
图中的保护关系就类似于最大权闭合子图。即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边。那么题目就转化成了最大权闭合子图的问题。
但是这个图有点特殊啊。。。 考虑有环的情况,显然这个环以及指向这个环的点都不能选。
所以还要把这个图的反图进行一遍拓扑排序,这样忽略掉了这些点了。。。
- # include <cstdio>
- # include <cstring>
- # include <cstdlib>
- # include <iostream>
- # include <vector>
- # include <queue>
- # include <stack>
- # include <map>
- # include <set>
- # include <cmath>
- # include <algorithm>
- using namespace std;
- # define lowbit(x) ((x)&(-x))
- # define pi acos(-1.0)
- # define eps 1e-
- # define MOD
- # define INF
- # define mem(a,b) memset(a,b,sizeof(a))
- # define FOR(i,a,n) for(int i=a; i<=n; ++i)
- # define FO(i,a,n) for(int i=a; i<n; ++i)
- # define bug puts("H");
- # define lch p<<,l,mid
- # define rch p<<|,mid+,r
- # define mp make_pair
- # define pb push_back
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- # pragma comment(linker, "/STACK:1024000000,1024000000")
- typedef long long LL;
- int Scan() {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- void Out(int a) {
- if(a<) {putchar('-'); a=-a;}
- if(a>=) Out(a/);
- putchar(a%+'');
- }
- const int N=;
- //Code begin...
- struct Edge{int p, next, w;}edge[N*N];
- int head[N], cnt=, cost[N], dee[N], n, m, s, t, vis[N];
- bool mark[N];
- queue<int>Q;
- vector<PII> E[N];
- void add_edge(int u, int v, int w){
- edge[cnt].p=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++;
- edge[cnt].p=u; edge[cnt].w=; edge[cnt].next=head[v]; head[v]=cnt++;
- }
- int bfs(){
- int i, v;
- mem(vis,-);
- vis[s]=; Q.push(s);
- while (!Q.empty()) {
- v=Q.front(); Q.pop();
- for (i=head[v]; i; i=edge[i].next) {
- if (edge[i].w> && vis[edge[i].p]==-) {
- vis[edge[i].p]=vis[v] + ;
- Q.push(edge[i].p);
- }
- }
- }
- return vis[t]!=-;
- }
- int dfs(int x, int low){
- int i, a, temp=low;
- if (x==t) return low;
- for (i=head[x]; i; i=edge[i].next) {
- if (edge[i].w> && vis[edge[i].p]==vis[x]+){
- a=dfs(edge[i].p,min(edge[i].w,temp));
- temp-=a; edge[i].w-=a; edge[i^].w += a;
- if (temp==) break;
- }
- }
- if (temp==low) vis[x]=-;
- return low-temp;
- }
- void Topsort(){
- FO(i,,n*m) if (!dee[i]) Q.push(i), mark[i]=true;
- while (!Q.empty()) {
- int u=Q.front(); Q.pop();
- FO(i,,E[u].size()) {
- PII v=E[u][i];
- if (!v.second) continue;
- --dee[v.first];
- if (!dee[v.first]) Q.push(v.first), mark[v.first]=true;
- }
- }
- }
- int main ()
- {
- int T, x, y, res=, tmp, sum=;
- scanf("%d%d",&n,&m); s=n*m; t=n*m+;
- FO(i,,n) FO(j,,m) {
- scanf("%d%d",&cost[i*m+j],&T);
- while (T--) {
- scanf("%d%d",&x,&y); E[x*m+y].pb(mp(i*m+j,));
- E[i*m+j].pb(mp(x*m+y,)); ++dee[x*m+y];
- }
- }
- 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];
- Topsort();
- FO(i,,n*m) {
- if (!mark[i]) continue;
- if (cost[i]>=) res+=cost[i], add_edge(s,i,cost[i]);
- else add_edge(i,t,-cost[i]);
- FO(j,,E[i].size()) {
- PII v=E[i][j];
- if (v.second||!mark[v.first]) continue;
- add_edge(i,v.first,INF);
- }
- }
- while (bfs()) while (tmp=dfs(s,INF)) sum+=tmp;
- printf("%d\n",res-sum);
- return ;
- }
BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)的更多相关文章
- 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...
- b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图
b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...
- 洛谷 - P2805 - 植物大战僵尸 - 最大流 - 最大权闭合子图
https://www.luogu.org/problemnew/show/P2805 最大权闭合子图的特点是,假如你要选一个结点,则要先选中它的所有子节点.正权连S负权连T,容量为绝对值,原图有向边 ...
- BZOJ 1565 植物大战僵尸(最大权闭合图)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: ...
- BZOJ 1565 植物大战僵尸 最大权闭合子图+网络流
题意: 植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: (1)价值: (2)保护集合,也就是这个植物可以保护矩阵中的某些格子. 现在你是僵尸,你每次只能从(i,m) 格子 ...
- 【BZOJ-1565】植物大战僵尸 拓扑排序 + 最小割
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1972 Solved: 917[Submit][Statu ...
- BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...
随机推荐
- 20155339 2016-2017-2 《Java程序设计》第1周学习总结
20155339 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 一直以为JAVA应该只是一种语言,研读了书本之后发现原来JAVA也代表了解决问题的平 ...
- RegExp,实现匹配合法邮箱(英文邮箱)的正则表达式
邮箱列表:@qq.com.@vip.qq.com.@foxmail.com,数字邮箱暂时不考虑 以下邮箱列表用于测试: lihaha@qq.com lihaha@vip.qq.com lihaha@f ...
- ElasticSearch 聚合查询百分比
这里用的是es5.6.9 bucket_script :它执行一个脚本,该脚本可以对多桶聚合中的指定度量执行每桶计算,指定的度量标准必须为数字,并且脚本必须返回数值. 官方语法 https://www ...
- python 内置模块(sys)
sys.argv 命令行参数List,第一个元素是程序本身路径sys.exit(n) 退出程序,正常退出时exit(0)sys.version 获取Py ...
- 搜索引擎ElasticSearch系列(三): ElasticSearch2.4.4 bigdesk插件安装
一:ElasticSearch bigdesk插件简介 bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况, ...
- [转]WIN2008 IIS7的日期格式
最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...
- ESP8266 NON-OS SDK 和 RTOS SDK实现GPIO中断不同点
ESP8266 Non-OS SDK 和 RTOS SDK 实现GPIO的方法稍有不同: 对于 Non-OS SDK,比如需要把 MTDO 配置成输入,同时下降沿触发中断: gpio_init(voi ...
- Openwrt能用的花生壳客户端
http://files.cnblogs.com/mazhiyong/phddns.zip 使用教程可参考官方文档 http://service.oray.com/question/116.html
- [转]git学习------>git-rev-parse命令初识
git学习------>git-rev-parse命令初识 2017年06月13日 10:04:13 阅读数:2172 一.准备工作 第一步:在d盘git test目录下,新建工作区根目录dem ...
- Lua学习笔记(7): 模块
模块 模块就像是c语言工程项目目录里的.h.c文件或外部依赖项,为某一个文件的代码提供依赖,其实就是把工作分成几个模块,方便项目的管理,提高开发效率和维护效率 在Lua中,模块其实就是一个表,实现方式 ...