首页 > 其他分享 >【CodeChef】Prison Escape(最短路)

【CodeChef】Prison Escape(最短路)

时间:2024-05-16 15:53:41浏览次数:10  
标签:Prison ll 位置 矩阵 短路 入点 Escape id CodeChef

题目大意:

给出一个01矩阵,求每个0移动(每次可以向有公共边的格子移动一步)到矩阵边界至少要经过多少个1。


考虑建最短路模型,将矩阵中的每个位置拆分为入点和出点,矩阵外部设为一个点。

枚举矩阵中的每个位置:

  • 如果这个位置在矩阵边界,矩阵外部向这个位置的入点连一条长度为0的边。
  • 如果这个位置是上的数是1,这个位置的入点向这个位置的出点连一条长度为1的边(否则长度为0)。
  • 枚举这个位置上下左右的位置,如果后者存在,则前者的出边向后者的入边连一条长度为0的边。

然后以矩阵外部为源点运行Dijkstra算法,即可得到每个0移动到矩阵边界至少要经过多少个1(为源点到此位置对应点最短路的长度)。

#include<bits/stdc++.h>
#define pt printf(">>>")
#define mid (((l)+(r))/2)
using namespace std;
typedef long long ll;
const ll N=3e5+10,inf=1e18+10,mod=1e9+7;
const ll dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
vector<pair<ll,ll> > G[N*2];
ll n,m;
char s[N],t[N];
ll d[N*2];
bool vis[N*2];
ll id(ll x,ll y){return (x-1)*m+y-1;}
void addedge(ll u,ll v,ll w){G[u].push_back(make_pair(v,w));}
void dijkstra(){
	priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > > que;
	for(ll i=0;i<=n*m*2;i++)d[i]=inf,vis[i]=false;
	d[2*n*m]=0;
	que.push(make_pair(0ll,2*n*m));
	while(que.size()){
		ll u=que.top().second;que.pop();
		if(vis[u])continue;
		vis[u]=true;
		for(ll i=0;i<G[u].size();i++){
			ll v=G[u][i].first,w=G[u][i].second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				que.push(make_pair(d[v],v));
			}
		}
	}
}
int main(){
	int T;
	cin >> T;
	while(T--){
		cin >> n >> m;
		for(ll i=0;i<=2*n*m;i++)G[i].clear();
		s[0]='\0';
		for(ll i=1;i<=n;i++){
			cin >> t;
			strcat(s,t);
		}
		for(ll i=1;i<=n;i++){
			for(ll j=1;j<=m;j++){
				if(i==1||j==1||i==n||j==m)addedge(2*n*m,id(i,j),0);
				addedge(id(i,j),n*m+id(i,j),s[id(i,j)]=='1'?1:0);
				for(ll dd=0;dd<4;dd++){
					ll nx=i+dir[dd][0],ny=j+dir[dd][1];
					if(nx<1||nx>n||ny<1||ny>m)continue;
					addedge(n*m+id(i,j),id(nx,ny),0);
				}
			}
		}
		dijkstra();
		ll ans=0;
		for(ll i=0;i<n*m;i++)if(s[i]=='0')ans=max(ans,d[i]);
		cout << ans << endl;
	}
	return 0;
}

标签:Prison,ll,位置,矩阵,短路,入点,Escape,id,CodeChef
From: https://www.cnblogs.com/alric/p/18196088

相关文章

  • 【CodeChef】3out1in(优先队列)
    题目大意:给出数组a,问对于所有满足\(1\lek\len\)的奇数\(k\),\(f([a_1,a_2,...,a_k])\)的值。\(f([a_1,a_2,...,a_n])\)的值为对数组\([a_1,a_2,...,a_n]\)进行\(\frac{n+1}{2}\)次操作(选择数组中的三个元素,将其中一个取相反数,然后让它们合并成一个元素)后,数组最后剩下元素的最大......
  • 【CodeChef】Origin(数论)
    题目大意:\(f(x)=\begin{cases}x,1\lex\le9\\f(x的各数位之和),x>9\\\end{cases}\)求\(\sum_{i=1}^{n}f(i)\)。根据打表找规律,我们会发现\(f(x)=(x-1)\bmod9+1\)。所以\(\sum_{i=1}^{n}f(i)\)\(=\sum_{i=1}^{\lfloor\frac{n}{9}\rfloor\cdot9}f(x)+\sum_{i=\l......
  • POI2008UCI-The Great Escape
    dp#POI#Year2008倒着跑这个过程,发现为每次拓宽一个矩形,记录这个矩形的对角的坐标,当前的方向,可以得到\(dp_{x_1,y_1,x_2,y_2,4}\),从同方向相邻的点,或者转向后经过一条边长的点转移过来,单次转移是\(\mathcal{O}(1)\)的但是这个会\(MLE\),考虑一般的优化方法,即滚动因为统计......
  • ANSI 转义序列(ANSI Escape Sequences)
    本文来自GithubGistfrom"fnky/ANSI.md"。下面是笔者翻译版本。持续更新中。ANSI转义序列标准Esc代码以Escape为前缀:Ctrl快捷键:^[八进制:\033Unicode:\u001b十六进制:\x1B十进制:27后面跟着命令,有时用左方括号([)分隔,称为控制序列引导码(CSI),后面可选地跟着......
  • 从 VNCTF2024 的一道题学习QEMU Escape
    说在前面本文的草稿是边打边学边写出来的,文章思路会与一个“刚打完用户态pwn题就去打QEMUEscape”的人的思路相似,在分析结束以后我又在部分比较模糊的地方加入了一些补充,因此阅读起来可能会相对轻松。(当然也不排除这是我自以为是)题目github仓库[1]题目分析流程[1-1]......
  • SP14846 GCJ1C09C - Bribe the Prisoners 题解
    非常好区间dp。我们发现直接依题做是困难的,因此考虑反着做。也即,假定起初那\(Q\)个牢房均为空,现在要将给定的\(Q\)的犯人插入其中,求最小代价。然后我们发现这题和P1775很像,相当于每插入一个人,两段不相邻的牢房就被合并到了一起。接着我们就考虑这玩意怎么做区间dp。......
  • CodeChef Chef and Churus 题解
    对给出的\(n\)个区间分块,设块长为\(B\)。每个块内计算每个位置的贡献(被覆盖次数)。具体地,记\(f_{i,j}\)表示第\(i\)个块第\(j\)个数被覆盖了多少次,这个可以用差分轻松维护。预处理复杂度\(O(\frac{n^2}{B})\)。现在考虑修改。记\(ans_i\)表示块\(i\)的贡献,那么对于......
  • CF932F Escape Through Leaf【DP,李超线段树】
    有一颗\(n\)个节点的树,根节点为\(1\)。每个节点有两个权值,第\(i\)个节点的权值为\(a_i,b_i\)。你可以从一个节点跳到它的子树内任意一个节点上。从节点\(x\)跳到节点\(y\)一次的花费为\(a_x\timesb_y\)。跳跃多次走过一条路径的总费用为每次跳跃的费用之和。求每个节......
  • ReadableStream/TransformStream/HMR/软件设计哲学/SSR 条件渲染/CSS.escape/Copilot
    ReadableStream,TransformStream-探索如何在React服务器组件中使用流来提升性能和用户体验。HMR-简介热模块替换技术,使前端开发更加高效。软件设计哲学-深入理解软件设计背后的哲学思考。SSR条件渲染组件-SSR条件渲染的实现方法,优化页面加载速度和SEO。C......
  • WordPress 技巧:解决 3.6 版本的 "wpdb::escape is deprecated" 错误提示
    来源:http://www.shanhubei.com/archives/13621.html升级到WordPress3.6之后,发现在debuglog中有很多以下的错误信息:Notice:wpdb::escapeisdeprecatedsinceversion3.6!Usewpdb::prepare()oresc_sql()instead.这个错误信息的意思是WordPress3.6将$wpdp类......