【noi】植物大战僵尸

反向最大闭合图+topsort;

题解:

1.从右往左链接相邻的植物;

2.引有向边保护-->被保护;

3.处理环;

4.负权连s,正权连t;

5.跑最大流;

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxx   10000000
using namespace std;
int read()
{
   int f=1,x=0;
   char ch;
   ch=getchar();while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
   while(ch>=‘0‘&&ch<=‘9‘){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
   return x*f;
}
int sum=0;
int st,ed;
int n,m;
int tot=0;
int vis[10000];
int level[10000];
int map[1000][1000];
int ww[600][500];
int c[100000];
int v[100000];
struct {int flow,next,y;}e[1000000];
int len=0;
int re[1000000];
int q[1000000],le[1000000],head,tail,lin[10000000];
void init(int x,int y,int flow)
{
   vis[y]++;
   e[++len].flow=flow;e[len].y=y;e[len].next=lin[x];lin[x]=len;re[len]=len+1;
   e[++len].flow=0;e[len].y=x;e[len].next=lin[y];lin[y]=len;re[len]=len-1;
   return ;
}
void initx()
{
	st=++tot;
    n=read();m=read();
    for(int i=0;i<=n-1;i++)for(int u=0;u<=m-1;u++){map[i][u]=++tot;if(u-1>=0)init(map[i][u],map[i][u-1],maxx);}
    ed=++tot;
    for(int i=0;i<=n-1;i++)
    {
		for(int u=0;u<=m-1;u++)
		{
			v[map[i][u]]=read();
			int w=read();
			for(int z=1;z<=w;z++)
			{
				int x,y;
				x=read();
				y=read();
				init(map[i][u],map[x][y],maxx);
			}
		}
	}
}
int f[1000000];
void topsort()
{
	head=0;tail=0;
	for(int i=map[0][0];i<=map[n-1][m-1];i++)
		if(vis[i]==0)q[++tail]=i;
   while(head++<tail)
   {
      int x=q[head];
      for(int i=lin[x];i;i=e[i].next)
      {
		 if(e[i].flow<=0)continue;
		 int y=e[i].y;
		 vis[y]--;
		 if(vis[y]==0)q[++tail]=y;
    }
   }
   for(int i=1;i<=tail;i++)
   {
	   f[q[i]]=1;
	   if(v[q[i]]>=0){init(q[i],ed,v[q[i]]),sum+=v[q[i]];}
	   else init(st,q[i],-v[q[i]]);
   }
}
bool makelevel()
{
   f[st]=1;
   f[ed]=1;
   memset(level,-1,sizeof(level));
   head=0;tail=1;
   q[1]=st;level[st]=0;
   while(head++<tail)
   {
	int x=q[head];
	for(int i=lin[x];i;i=e[i].next)
	{
		int y=e[i].y;
		if(e[i].flow<=0)continue;
		if(f[y]==0)continue;
		if(level[y]==-1)
		{
			level[y]=level[x]+1;
			q[++tail]=y;
		}
	}
   }
   //cout<<"s";
   return level[ed]!=-1;
}
int maxlow(int x,int flow)
{
   if(x==ed)return flow;
   int maax=0;
   int d;
    for(int i=lin[x];i&&maax<flow;i=e[i].next)
    {
		int y=e[i].y;
		if(f[y]==0)continue;
		if(e[i].flow<=0)continue;
		if(level[y]!=level[x]+1)continue;
		if(d=maxlow(y,min(flow-maax,e[i].flow)))
		{
			maax+=d;
			e[i].flow-=d;
			e[re[i]].flow+=d;

		}
	}
   if(maax==0)level[x]=-1;
   return maax;
}
int ans=0;
void dinic()
{
   int d;
   while(makelevel())
      while(d=maxlow(st,maxx))
      {
		ans+=d;
      }
}
int main()
{
   initx();
   topsort();
   memset(q,0,sizeof(q));
   dinic();
   cout<<sum-ans<<endl;
   return 0;
}

  

时间: 2024-07-28 19:54:49

【noi】植物大战僵尸的相关文章

NOI2009植物大战僵尸

这题应该分两步来做: 1.拓扑排序,去掉无敌点 2.求最大闭合子图 需要注意几点: 1.拓扑排序时,如果(i,j)可以攻击到(x,y),那么增加(x,y)的入度,而不是(i,j)的入度 因为入度代表着要攻击它需要事先攻击几个点 2.求最大闭合子图时,用所有的正权点-最大流 3.求最大闭合子图时,如果(i,j)可以攻击到(x,y),那么连一条边(x,y)到(i,j),容量为正无穷 因为在最大闭合子图中边(x,y)到(i,j)意味着选(x,y)就必须要选(i,j),这与实际含义相符 4.s到正权点,

98植物大战僵尸OL_僵尸迷阵

最近在玩植物大战僵尸Ol打到僵尸迷阵,打了个700分倒数第一,擦.....俗话说的好,失败是成功的妈妈,于是花了点时间写了一个小玩意,我相信下次我一定能拿第一 代码非常简单: using UnityEngine; using System.Collections; using UnityEngine.UI; public class MyScript : MonoBehaviour { // Use this for initialization void Start () { } // Upd

植物大战僵尸2天空之城安卓版发布

全体注意!一大波飞行僵尸正在接近中——中国独创版<植物大战僵尸2天空之城>安卓版终于发布了.超乎想象的空战体验.全新僵尸植物军团.独特闪电环境效果和史无前例的战舰成长系统,让你和戴夫共同肩负守卫天空之城的荣耀重任.赶紧下载游戏,加入云端激战吧. <植物大战僵尸2天空之城>安桌版上线 [中国区独有版本 打造铿锵空战体验] <植物大战僵尸2>即将迎来两周年生日,为感谢中国玩家一直以来的热情支持,EA/PopCap携手拓维游戏打造了这款中国区独有新版本<植物大战僵尸2天

原生JS实现的h5小游戏-植物大战僵尸

代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结合面向对象的编程思想进行开发,在实现时使用了部分es6语法,对于es6语法不太熟悉的小伙伴可以先查阅相关资料了解一下. 如有需要,可根据自己的需求修改源码样式.源码配置属性代码,实现个性化定制. 以下为文件目录结构示意图,核心代码在js文件夹下的四个common.js.main.js.game.js

java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码

Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁的大叔阿姨,下到7.8岁的小弟弟妹妹都听说和玩过这游戏.在以前智能手机还没流行的时候,各种黑网吧,游戏厅便有着玩这游戏的人.当3G技术现世,半智能手机和智能手机出现后,这款游戏更是如日中天,与愤怒的小鸟一起霸占了手机游戏市场(但当时估计都是盗版的). 相信有些使用b站的小伙伴,应该看过很多这样的视频: 这种视

[转]植物大战僵尸95版技术分析

植物大战僵尸95版不是原版,是由植物大战僵尸吧吧友冥谷川恋制作. 本链接只提供95版的完整压缩包和0-95版的所有exe主程序 压缩包,只玩95版的直接下载95安装包解压即可玩,如果需要玩0-94版,再下载本链接提供的主程序exe压缩包,把其它版本的主程序解压到游戏目录直接运行即可.感谢植吧“崇明人家123”制作提供0-v95僵尸得到了极大强化“我会说我这个版本的冒险一周目都过不去吗?”这个出怪模式非常刺激,需要你强大的pvz功底和运气铁桶铁门.显示隐藏关卡.允许后台运行.刺激的出怪模式.无限制

【NOI2009】植物大战僵尸

P1589 - [NOI2009]植物大战僵尸 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而 Zombies进攻.该款游戏包含多种不同的挑战系列,比如Protect Your Brain.Bowling等等.其中最为经典的,莫过于玩家通过控制Plants来防守Zombies的进攻,或者相反地由玩家通过控制Zombies 对Plants发起进攻. 现在,我们将要考

洛谷 P2805 BZOJ 1565 植物大战僵尸

题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多种不同的挑战系列,比如Protect Your Brain.Bowling等等.其中最为经典的,莫过于玩家通过控制Plants来防守Zombies的进攻,或者相反地由玩家通过控制Zombies对Plants发起进攻. 现在,我们将要考虑的问题是游戏中Zombies对Plants的进攻,请注意,本题中

COGS410. [NOI2009] 植物大战僵尸

410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多种不同的挑战系列,比如Protect Your Brain.Bowling等等.其中最为经典的,莫过于玩家通过控制Plants来