题目链接

  这题数据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. java面试题(杨晓峰)---第一讲谈谈你对java平台的理解

    本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...

  2. JS编程规范指南

    原文:github.com/ryanmcdermott/clean-code-javascript 说明:本文翻译自 github 上的一个项目,只取部分精华. 一.变量 用有意义且常用的单词命名 / ...

  3. Django 从0开始创建一个项目

    title: Django 从0开始创建一个项目 tags: Django --- Django 从0开始创建一个项目 创建Django工程及配置 创建工程:django-admin starproj ...

  4. java String中的replace(oldChar,newChar) replace(CharSequence target,CharSequence replacement) replaceAll replaceFirst 面试题:输入英文语句,单词首字符大写后输出 char String int 相互转换

    package com.swift; import java.util.Scanner; public class FirstChat_ToCaps_Test { public static void ...

  5. 如何使Recovery分区正常工作

    通常安装完系统后,在进入Clover菜单选择Recovery分区后是进不去的,对于我这种完美强迫症患者来说这是不能忍的,最后,终于在网上找到个简单办法让它工作,废话不多说,上命令: 先找到Recove ...

  6. 科技庄园(背包dp)---对于蒟蒻来说死了一大片的奇题

    题目描述: Life种了一块田,里面种了一些桃树. Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!” PFT思考了一会,最终答应了! 由于PF ...

  7. matplotlib绘图股票走势图实践

    导入模块 import pandas as pdimport numpy as npfrom pandas import Series,DataFrameimport matplotlib.pyplo ...

  8. Linux基础学习-NFS网络文件系统实时文件共享

    NFS网络文件系统 如果大家觉得Samba服务程序的配置太麻烦了,那么你共享文件的主机都是Linux系统,那么推荐大家在客户端部署nfs服务来共享文件.nfs(网络文件系统)服务可以将远程Linux系 ...

  9. destoon 后台入口文件分析

    <?php/* [Destoon B2B System] Copyright (c) 2008-2015 www.destoon.com This is NOT a freeware, use ...

  10. php通过geohash算法实现查找附近的商铺

    geohash有以下几个特点: 首先,geohash用一个字符串表示经度和纬度两个坐标.利用geohash,只需在一列上应用索引即可. 其次,geohash表示的并不是一个点,而是一个矩形区域.比如编 ...