最小生成树+LCA【洛谷 P2245】 星际导航
【洛谷 P2245】 星际导航
题目描述
sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好。为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系,两个星系之间有边就表示两个星系之间可以直航,而边权则是航行的危险程度。
sideman 现在想把危险程度降到最小,具体地来说,就是对于若干个询问(A, B),sideman 想知道从顶点A 航行到顶点B 所经过的最危险的边的危险程度值最小可能是多少。作为sideman 的同学,你们要帮助sideman 返回家园,兼享受安全美妙的宇宙航行。所以这个任务就交给你了。
输入输出格式
输入格式:
第一行包含两个正整数N 和M,表示点数和边数。
之后 M 行,每行三个整数A,B 和L,表示顶点A 和B 之间有一条边长为L 的边。顶点从1 开始标号。
下面一行包含一个正整数 Q,表示询问的数目。
之后 Q 行,每行两个整数A 和B,表示询问A 和B 之间最危险的边危险程度的可能最小值。
输出格式:
对于每个询问, 在单独的一行内输出结果。如果两个顶点之间不可达, 输出impossible。
货车运输。最小瓶颈路。
code:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int wx=1000017;
inline int read(){
	int sum=0,f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
	return sum*f;
}
int fa[wx],dep[wx];
int f[wx][23],dis[wx][23];
int head[wx];
int n,m,num,q;
struct node{
	int l,r,d;
	friend bool operator < (const node& a,const node& b){
		return a.d<b.d;
	}
}a[wx*2];
struct e{
	int nxt,to,dis;
}edge[wx*2];
void add(int from,int to,int dis){
	edge[++num].nxt=head[from];
	edge[num].to=to;
	edge[num].dis=dis;
	head[from]=num;
}
int find(int x){
	if(x==fa[x])return x;
	return fa[x]=find(fa[x]);
}
void build(int flag){
	add(a[flag].l,a[flag].r,a[flag].d);
	add(a[flag].r,a[flag].l,a[flag].d);
}
void Kruskal(){
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(a+1,a+1+m);
	for(int i=1;i<=m;i++){
		if(find(a[i].l)!=find(a[i].r)){
			fa[find(a[i].l)]=find(a[i].r);
			build(i);
		}
	}
}
void dfs(int u,int father){
	dep[u]=dep[father]+1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==father)continue;
		f[v][0]=u;
		dis[v][0]=edge[i].dis;
		dfs(v,u);
	}
}
void pre(){
	for(int j=1;j<=21;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
			dis[i][j]=max(dis[i][j-1],dis[f[i][j-1]][j-1]);
		}
	}
}
int FFF(int x,int y){
	int re=0;
	if(dep[x]<dep[y])swap(x,y);
	for(int i=21;i>=0;i--){
		if(dep[f[x][i]]>=dep[y]){
			re=max(re,dis[x][i]);
			x=f[x][i];
		}
	}
	if(x==y)return re;
	for(int i=21;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			re=max(re,dis[x][i]);
			re=max(re,dis[y][i]);
			x=f[x][i]; y=f[y][i];
		}
	}
	return max(re,max(dis[x][0],dis[y][0]));
}
int main(){
	n=read(); m=read();
	for(int i=1;i<=m;i++){
		int x,y,z;
		x=read(); y=read(); z=read();
		a[i].l=x; a[i].r=y; a[i].d=z;
	}
	Kruskal();
	dfs(1,0); pre();
	q=read();
	for(int i=1;i<=q;i++){
		int x,y;
		x=read(); y=read();
		FFF(x,y);
		if(find(x)==find(y)) printf("%d\n",FFF(x,y));
		else printf("impossible\n");
	}
	return 0;
}
最小生成树+LCA【洛谷 P2245】 星际导航的更多相关文章
- 洛谷 P2245 星际导航 解题报告
		P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ... 
- [洛谷P2245]星际导航
		题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ... 
- 【洛谷P2245】星际导航
		题面 题解 \(kruskal\)重构树板子题??(大雾 因为重构树上两点之间的\(LCA\)的权值就是原图上最小生成树上的瓶颈. 所以建个重构树,跑\(LCA\)即可. 代码 #include< ... 
- P2245 星际导航
		题目描述 sideman 做好了回到 Gliese星球的硬件准备,但是 sideman 的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有 N 个顶点和 M 条边的带权无向图,顶点表示 ... 
- 【luogu P2245 星际导航】 题解
		题目链接:https://www.luogu.org/problemnew/show/P2245 = 货车运输 被逼着写过mst+lca 后来成了mst+树剖 #include <cstdio& ... 
- P2245 星际导航  瓶颈路
		\(\color{#0066ff}{ 题目描述 }\) sideman 做好了回到 \(\text{Gliese}\) 星球的硬件准备,但是 \(\text{sideman}\) 的导航系统还没有完全 ... 
- [LUOGU] P2245 星际导航
		题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系, ... 
- 洛谷.2754.星际转移问题(最大流Dinic 分层)
		题目链接 枚举时间 每一个时间点 对于每个之前的位置像当前位置连边,表示这一时刻可待在原地 每艘船 之前时刻位置向当前时刻连边 注意别漏了0时刻src连向earth的边 #include<cst ... 
- 洛谷P2469 星际竞速
		上下界费用流比较无脑,提供一种更巧妙的费用流,无需上下界. #include <cstdio> #include <algorithm> #include <queue& ... 
随机推荐
- C# 不使用Task实现的多线程顺序执行
			多线程有很好的并发性即无序性,在某些特殊情况下需要用到多线程然而又要使其具备顺序性,这种时候就有了一个特殊的场景那就是多线程顺序执行,在现在VS2015中Task自带了顺序执行的方法,但在此之前的旧项 ... 
- DataGridView风格设置
			http://blog.csdn.net/wangzhen209/article/details/51744518 http://www.cnblogs.com/hanpanpan 
- qt安装必要的库 qt开源安装包下载
			yum install mesa-libGL-devel mesa-libGLU-devel #yum install freeglut-devel http://www.qt.io/download ... 
- javascript——对象的概念——函数 3 (使用技巧)
			1.回调函数:将函数A传给函数B,由函数B来执行A,则称A为回调函数. 例1: 例2 function addone(a){;}; //定义一个回调函数 function mulitiply(a,b, ... 
- js兼容事件
			//浏览器检测(function () { window.sys = {}; var ua = navigator.userAgent.toLowerCase(); var s; (s = ua.ma ... 
- hbase.client.RetriesExhaustedException: Can't get the locations  hive关联Hbase查询报错
			特征1: hbase.client.RetriesExhaustedException: Can't get the locations 特征2: hbase日志报错如下:org.apache.zoo ... 
- cfree使用cygwin编译程序出现计算机丢失cygwin1.dll解决办法
			这种情况多是环境没配好,我的是64位cygwin C:\cygwin64\bin 加入到环境变量中,重打开cfree就可以解决. 
- 属性操作get.Attribute()
- JAVA中string类的split方法
			split([separator,[limit]])第一个参数为分隔符,可以是一个正则表达式,第二个参数为返回结果数组的长度 
- shell直接退出后 后台进程关闭的原因和对处
			在linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了.都 ... 
