首页 > 其他分享 >Nanami and the House Protecting Problem

Nanami and the House Protecting Problem

时间:2024-07-02 12:30:33浏览次数:8  
标签:6005 int House add Nanami pr2 pr1 Problem id

  • 求出最大流后,从源点开始沿残量网络BFS,标记能够到达的点。E中所有连接已标记点和未标记点的边构成最小割
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[6005];
vector<int>c[6005];
vector<int>d[6005];
bool v[6005];
int pr1[6005],pr2[6005];
char w[1005][1005];
int n,m;
int s=0,t;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
void update(int l)
{
	int p=t;
	while(p!=s)
	{
		c[pr1[p]][pr2[p]]-=l;
		c[p][d[pr1[p]][pr2[p]]]+=l;
		p=pr1[p];
	}
}
int dfs1(int n1,int l)
{
	if(n1==t)
	{
		update(l);
		return l;
	}
	else
	{
		for(int i=0;i<a[n1].size();i++)
		{
			if(c[n1][i]!=0&&v[a[n1][i]]==false)
			{
				pr1[a[n1][i]]=n1;
				pr2[a[n1][i]]=i;
				v[a[n1][i]]=true;
				int va=dfs1(a[n1][i],min(l,c[n1][i]));
				if(va!=0)
				{
					return va;
				}
			}
		}
	}
	return 0;
}
void dfs2(int n1)
{
	v[n1]=true;
	for(int i=0;i<a[n1].size();i++)
	{
		if(v[a[n1][i]]==false&&c[n1][i]!=0)
		{
			dfs2(a[n1][i]);
		}
	}
}
void add(int u,int v,int w)
{
	a[u].push_back(v);
	a[v].push_back(u);
	c[u].push_back(w);
	c[v].push_back(0);
	d[u].push_back(a[v].size()-1);
	d[v].push_back(a[u].size()-1);
}
int id(int i,int j,int opt)
{
	return (i-1)*m+j+opt*n*m;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		t=2*n*m+1;
		for(int i=0;i<=2*n*m+1;i++)
		{
			a[i].clear();
			c[i].clear();
			d[i].clear();
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>w[i][j];
				if(w[i][j]=='H')
				{
					add(s,id(i,j,0),INT_MAX);
				}
				if(w[i][j]=='.')
				{
					if(i==1||i==n||j==1||j==m)
					{
						add(id(i,j,1),t,INT_MAX);
					}
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				int f;
				cin>>f;
				if(f>0)
				{
					add(id(i,j,0),id(i,j,1),f);
				}
				else
				{
					add(id(i,j,0),id(i,j,1),INT_MAX);
				}
				if(w[i][j]!='#')
				{
					for(int k=0;k<4;k++)
					{
						if(w[i+dx[k]][j+dy[k]]=='.'||w[i+dx[k]][j+dy[k]]=='H')
						{
							add(id(i+dx[k],j+dy[k],1),id(i,j,0),INT_MAX);
						}
					}
				}
			}
		}
		int ans=0,va;
		memset(v,false,sizeof(v));
		v[s]=true;
		while(va=dfs1(s,INT_MAX))
		{
			for(int i=0;i<=2*n*m+1;i++)
			{
				v[i]=false;
			}
			v[s]=true;
			ans+=va;
		}
		memset(v,false,sizeof(v));
		dfs2(s);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(v[id(i,j,0)]==true&&v[id(i,j,1)]==false)
				{
					w[i][j]='#';
				}
			}
		}
		cout<<ans<<endl;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cout<<w[i][j];
				w[i][j]=' ';
			}
			cout<<endl;
		}
	}
	return 0;
}
/*
1
5 5
1 2 2
2 3 2
3 5 3
1 4 5
4 3 6
*/

标签:6005,int,House,add,Nanami,pr2,pr1,Problem,id
From: https://www.cnblogs.com/watersail/p/18279678

相关文章

  • 3个企业级最佳实践,教你ByteHouse云数仓这么用
    随着各业务场景各行业数字化转型加快,数据量呈爆炸式增长。在拥有庞大数据的同时,业务也在分析、查询与响应层面,对数据库系统性能提出了更高要求。云原生技术推动了分布式数据库系统的迭代升级,对云数仓技术而言,“写入能力、高性能查询、高并发、架构精简、成本控制”的一系列挑战,是......
  • 研0 冲刺算法竞赛 day8 P1303 A*B Problem
    思路:用char[]存储输入,后用int[]逐位计算,根据乘法计算规则错位相加,用数组存储,然后考虑进位,最后倒序输出代码:#include<iostream>#include<cstring>usingnamespacestd;chara1[10001],b1[10001];inta[10001],b[10001],c[10001];intmain(){ cin>>a1>>b1; for......
  • FlinkCDCSQL数据同步mysql->clickhouse
    FlinkCDC(ChangeDataCapture)SQL用于实现数据库的数据变更捕获,并通过SQL接口进行处理。以下是一个基本的示例,全量+增量数据mysql同步到clickhouse,展示如何使用FlinkCDCSQL进行数据同步。首先,确保你有Flink和FlinkCDC的环境配置好。1.mysql测试source表(准备......
  • Nanami and the Last Enigma (hard version)
    如果从前缀和的视角考察题目中需要统计的信息,那么子段和=x等价于s[r]-s[l-1]=x于是我们虽然不能O(1)地求出w(l,r),但是可以O(1)地将已知的w(l,r)扩展w(l,r)是一个非常明显的满足“包含大于等于交叉”的四边形不等式的函数,除此之外,通过打表找规律,也可以发现DP有决策单调性决策单......
  • clickhouse集群及单节点库表占用存储
    1、单节点查询库表存储占用‘system’:库名SELECT  databaseAS`库名`,  tableAS`表名`,  sum(rows)AS`总行数`,  formatReadableSize(sum(data_uncompressed_bytes))AS`原始大小`,  formatReadableSize(sum(data_compressed_bytes))AS`压......
  • 详解 ClickHouse 的查询优化
    一、单表查询1.使用prewhere替代whereprewhere和where语句的作用相同,都是用来过滤数据prewhere和where语句的不同在于:prewhere只支持MergeTree族系列引擎的表prewhere首先会读取指定的列数据来判断数据过滤,等待数据过滤之后再读取select声明的列字段......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • 详解 ClickHouse 的分片集群
    一、简介分片功能依赖于Distributed表引擎,Distributed表引擎本身不存储数据,有点类似于MyCat之于MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据ClickHouse进行分片集群的目的是解决数据的横向扩容,通过分片把一份完整......
  • 打卡信奥刷题(132)用Scratch图形化工具信奥P9913 [普及组]「RiOI-03」water problem
    「RiOI-03」waterproblem题目描述给定一个正整数nnn,问一个正方形能否被分割为nn......