ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3645 [APIO2015]雅加达的摩天楼

2021-04-16 16:32:45  阅读:146  来源: 互联网

标签:ch int 摩天楼 P3645 sqrt APIO2015 vis step w1


P3645 [APIO2015]雅加达的摩天楼(BFS+根号平衡)

牛逼题,根本不用最短路,直接分析得出:

对于跳跃能力小于 \(\sqrt{n}\) 的,可行的状态只有 \(O(n\sqrt{n})\) 个。

对于跳跃能力大于 \(\sqrt{n}\) 的,最多跳 \(\sqrt{n}\) 次,所以可行的状态只有 \(O(m\sqrt{n})\) 个。

所以直接 \(BFS\) 一遍再判重即可,时间复杂度 \(O(n\sqrt{n})\) ,用 \(Map\) 会 T 。

Map代码:

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
template <typename T>
inline void read(T &x){
	x=0;bool f=false;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=1e5+5,M=105;
int n,m,dis[N],S,T;
bool vis[N];
struct node{
	int b,p,step;
	node(int b=0,int p=0,int step=0):b(b),p(p),step(step){}
};
map<PII,int> Map;
queue<node> q;
vector<int> vec[N];
void BFS(){
	for(int i=0;i<vec[S].size();i++) q.push(node(S,vec[S][i],0)),Map[make_pair(S,vec[S][i])]=1;
	while(!q.empty()){
		node t=q.front();q.pop();
		int pos=t.b,x=t.p,step=t.step;
		if(dis[T]!=-1) break;
		int w1=pos-x;
		if(!Map[make_pair(w1,x)]||(w1>=0&&!vis[w1])){
			if(w1>=0){
				if(!vis[w1]){
					vis[w1]=true;
					for(int i=0;i<vec[w1].size();i++) q.push(node(w1,vec[w1][i],step+1)),Map[make_pair(w1,vec[w1][i])]=1;
				}
				q.push(node(w1,x,step+1));Map[make_pair(w1,x)]=1,dis[w1]=step+1;
			}
		}
		int w2=pos+x;
		if(!Map[make_pair(w2,x)]||(w2<n&&!vis[w2])){
			if(w2>=n) continue;
			if(!vis[w2]){
				vis[w2]=true;
				for(int i=0;i<vec[w2].size();i++) q.push(node(w2,vec[w2][i],step+1)),Map[make_pair(w2,vec[w2][i])]=1;
			}
			q.push(node(w2,x,step+1));Map[make_pair(w2,x)]=1,dis[w2]=step+1;
		}
	}
}
int main(){
	read(n),read(m);
	int u,v;read(u),read(v);q.push(node(u,v,0));S=u;
	read(u),read(v);T=u;dis[T]=-1;vec[u].push_back(v);
	for(int i=3;i<=m;i++) read(u),read(v),vec[u].push_back(v);
	if(S==T){write(0);return 0;}
	Map[make_pair(u,v)]=1;vis[S]=true,dis[S]=0;
	BFS();
	write(dis[T]);
	return 0;
}

标签:ch,int,摩天楼,P3645,sqrt,APIO2015,vis,step,w1
来源: https://www.cnblogs.com/Akmaey/p/14667485.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有