题目链接

  这题数据xie强qwq。拓扑用的那个图建反了得80.

  一眼看出(个屁,题解上都说一眼看出,然而我还是太蒻了)这是个最大权闭合图。从被保护植物向保护植物连边,然后跑最大流,用正点权和减去。

  哦最大权闭合图我会。

  准备开始码。

  等等题解下面好像还写东西?

  emmmm有环,所以拓扑排序……

  好,我写……

  写了半小时,调了两发过样例交了。

  wtf80?

  然后想了半小时,想不出来为什么qwq、

  然后手推。

  不对呀数据给的这张图拓扑不动呀?

  然后想了想,觉得不对呀……应该反着拓扑才对……

  然后翻题解

  emm果然是在反向图上拓扑。

  emmmmmm

  于是沉吟良久改了四句话,然后就A了。

  qwqqqqqq。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<queue>
#define maxn 12000
#define maxm 1000000
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n,m;
inline int count(int i){ return i&?i+:i-; }
inline int calc(int i,int j){ return (i-)*m+j; }
int dfn[maxn];
bool vis[maxn];
int list[maxn];
int Start,End;
int indl[maxn];
bool ext[maxn];
queue<int>f; struct Pic{
struct Edge{
int next,to,val;
}edge[maxm];
int head[maxn],num;
Pic(){memset(head,,sizeof(head)); num=; }
inline void addedge(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
}
inline void add(int from,int to,int val){
addedge(from,to,val);
addedge(to,from,);
}
bool bfs(){
memset(vis,,sizeof(vis));
dfn[Start]=; vis[Start]=;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front(); q.pop();
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||edge[i].val==) continue;
vis[to]=; dfn[to]=dfn[from]+;
q.push(to);
}
}
return vis[End];
}
int dfs(int x,int val){
if(x==End||val==) return val;
int flow=; vis[x]=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val==||dfn[to]!=dfn[x]+) continue;
int now=dfs(to,min(val,edge[i].val));
edge[i].val-=now; edge[count(i)].val+=now; val-=now; flow+=now;
if(val<=) break;
}
if(val!=flow) dfn[x]=-;
return flow;
}
inline int maxflow(){
int ans=;
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=Start;i<=End;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(now==) break;
ans+=now;
}
return ans;
}
}Old,New;
int sco[][];
int sum; int main(){
n=read(),m=read();
for(int i=;i<=n;++i)
for(int j=;j<m;++j){
int x=calc(i,j+);
Old.addedge(x,calc(i,j),);
indl[calc(i,j)]++;
//Old.addedge(calc(i,j),x,0);
//indl[x]++;
}
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
sco[i][j]=read();
int x=read();
for(int k=;k<=x;++k){
int a=read()+,b=read()+;
int opt=calc(a,b);
Old.addedge(calc(i,j),opt,);
indl[opt]++;
//Old.addedge(opt,calc(i,j),0);
//indl[calc(i,j)]++;
}
}
for(int i=;i<=n*m;++i)
if(indl[i]==){
f.push(i);
ext[i]=;
}
while(!f.empty()){
int from=f.front(); f.pop();
for(int i=Old.head[from];i;i=Old.edge[i].next){
int to=Old.edge[i].to;
indl[to]--;
if(indl[to]==){
ext[to]=;
f.push(to);
}
}
}
End=n*m+;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
int ret=calc(i,j);
if(ext[ret]==) continue;
if(sco[i][j]>) sum+=sco[i][j];
if(sco[i][j]>) New.add(Start,ret,sco[i][j]);
else New.add(ret,End,-sco[i][j]);
for(int k=Old.head[ret];k;k=Old.edge[k].next){
int to=Old.edge[k].to;
New.add(to,ret,0x7fffffff);
}
}
int ans=New.maxflow();
printf("%d",sum-ans);
return ;
}

【Luogu】P2805植物大战僵尸(拓扑排序+最大流)的更多相关文章

  1. P2805 [NOI2009]植物大战僵尸 (拓扑排序 + 最小割)

    题意:N*M的矩阵 每个点上都有一颗植物 僵尸只能从每一行的最右边向左进攻 每个植物有攻击范围 可以保护在攻击范围内的植物 同时每一颗植物也保护他左边的植物 摧毁每个植物能获得价值 如果这个植物被保护 ...

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

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

  3. BZOJ 1565 植物大战僵尸(拓扑排序+最大权闭合子图)

    图中的保护关系就类似于最大权闭合子图.即你想杀x,你就一定要杀掉保护x的点,那么把x向保护它的点连边.那么题目就转化成了最大权闭合子图的问题. 但是这个图有点特殊啊... 考虑有环的情况,显然这个环以 ...

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

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

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

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

  6. BZOJ_1565_[NOI2009]_植物大战僵尸_(Tarjan+最大流+最大权闭合图)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1565 n*m的矩阵,可以种植植物,僵尸从图的右边进入吃植物.前面的植物可以保护后面的植物,还有 ...

  7. Luogu P1113 杂务 【拓扑排序】 By cellur925

    题目传送门 这题我们一看就知道是拓扑排序,然而在如何转化问题上花了大工夫,一个小时后最后还是无奈看了题解qwq. 显然我们可以对于每个任务,从他的前导任务到他连一条边,最后我们可以得到一个DAG.在这 ...

  8. luogu 3441 [POI2006]MET-Subway 拓扑排序+思维

    Description 给出一棵N个结点的树,选择L条路径,覆盖这些路径上的结点,使得被覆盖到的结点数最多. Input 第一行两个正整数N.L(2 <= N <= 1,000,000, ...

  9. P2805 [NOI2009]植物大战僵尸(最小割+拓扑排序)

    题意: n*m的矩阵,每个位置都有一个植物.每个植物都有一个价值(可以为负),以及一些它可以攻击的位置.从每行的最右面开始放置僵尸,僵尸从右往左行动,当僵尸在植物攻击范围内时会立刻死亡.僵尸每到一个位 ...

随机推荐

  1. centos7-httpd服务器

    Apache WEB服务器入门简介: Apache HTTP Server是Apache软件基金会的一个开源的网页服务器,可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是目 ...

  2. VS连接SQL Server 2008,并实现登录和注册功能

    --------------------- 作者:Cambridge 来源:CSDN 原文:https://blog.csdn.net/cambridgeacm/article/details/797 ...

  3. C#MySQL增删改查

    首先在项目中添加引用 using MySql.Data.MySqlClient; 连接字符串  private string connString="server=localhost;use ...

  4. css3中的nth-child和nth-of-type的区别

    实例: 首先创建一个HTML结构 <div class="post"> <p>我是文章的第一段落</p> <p>我是文章的第二段落& ...

  5. Sorted Union-freecodecamp算法题目

    Sorted Union 1.要求 写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组. 换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但 ...

  6. destoon去除编辑器替换图片删除原图功能,删除信息删除相关图片功能

    去除这些功能会造成大量垃圾图片,但是客户存在大量复制内容,其中图片一样,为了防止客户替换其中一个图片或者删除信息 造成其他复制信息图片丢失 去除文章模型级联图片功能. 对应模块class.php se ...

  7. graph-Dijkstra's shortest-path alogorithm

    直接贴代码吧,简明易懂. 后面自己写了测试,输入数据为: a b c d e 0 1 4 0 2 2 1 2 3 1 3 2 1 4 3 2 1 1 2 3 4 2 4 5 4 3 1 也就是课本上1 ...

  8. LeetCode(138) Copy List with Random Pointer

    题目 A linked list is given such that each node contains an additional random pointer which could poin ...

  9. Linux 关于SELinux的命令及使用

    1. 模式的设置 : 修改/etc/selinux/config文件中的SELINUX=”" 的值 ,然后重启.enforcing:强制模式,只要selinux不允许,就无法执行 permi ...

  10. LightOj:1030-Discovering Gold(期望dp模板)

    传送门:http://www.lightoj.com/volume_showproblem.php?problem=1030 Discovering Gold Time Limit: 2 second ...