题解 P1902 刺杀大使

Posted Mr_think

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P1902 刺杀大使相关的知识,希望对你有一定的参考价值。

P1902 刺杀大使

题目大意:

找出一条路径,使得从第 \\(1\\) 行到第 \\(n\\) 的上的最大值最小

solution:

根据黑体字,很容易想到二分:
二分最大值,广搜验证。

细节处理:

  1. 广搜边界。
  2. 队列、标记初始化。
代码
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
int p[N][N];
int n,m;
int dx[10]=0,1,0,-1;
int dy[10]=1,0,-1,0;
queue<PII> q;
bool vis[N][N];
bool out(int x,int y)
	if(x<1||x>n||y<1||y>m) return 1;
	return 0;

bool check(int hurt)
	memset(vis,0,sizeof(vis));
	while(q.size()) q.pop();
	q.push(make_pair(1,1));
	vis[1][1]=1;
	while(q.size())
		int x=q.front().first,y=q.front().second;q.pop();
		if(x==n) return 1;
		for(int z=0;z<4;z++)
			int xx=x+dx[z],yy=y+dy[z];
			if(out(xx,yy)) continue;
			if(p[xx][yy]<=hurt&&!vis[xx][yy])
				q.push(make_pair(xx,yy));
				vis[xx][yy]=1;
			
		
	
	return 0;

int main()
	int l=0,r;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&p[i][j]);
			r=max(r,p[i][j]);
		
	
	while(l<r)
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else		   l=mid+1;
	
	printf("%d",l);
	return 0;


End

(但没完全End)

sulotion2:

考虑贪心做法,因为只与最大值有关,所以根据边权从小到大枚举边,加到并查集,最后判断连通性。

细节处理:

  1. 点与点之间的边权为点权取 \\(\\max\\)
  2. 第一行与最后一行可缩为一点。
代码
咕了。

End

以上是关于题解 P1902 刺杀大使的主要内容,如果未能解决你的问题,请参考以下文章

线程同步——死锁问题

摩尼教刺杀宋徽宗差点成功:《清明上河图密码3》,探案推理与历史细节双绝。五星推荐。以下严重剧透。

[CF1523F] Favorite Game

4EVERLAND 全球大使计划,成为大使获得丰富奖励

大使映射问题

大使显示上游没有健康