【洛谷 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】 星际导航的更多相关文章

  1. 洛谷 P2245 星际导航 解题报告

    P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ...

  2. [洛谷P2245]星际导航

    题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ...

  3. 【洛谷P2245】星际导航

    题面 题解 \(kruskal\)重构树板子题??(大雾 因为重构树上两点之间的\(LCA\)的权值就是原图上最小生成树上的瓶颈. 所以建个重构树,跑\(LCA\)即可. 代码 #include< ...

  4. P2245 星际导航

    题目描述 sideman 做好了回到 Gliese星球的硬件准备,但是 sideman 的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有 N 个顶点和 M 条边的带权无向图,顶点表示 ...

  5. 【luogu P2245 星际导航】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2245 = 货车运输 被逼着写过mst+lca 后来成了mst+树剖 #include <cstdio& ...

  6. P2245 星际导航 瓶颈路

    \(\color{#0066ff}{ 题目描述 }\) sideman 做好了回到 \(\text{Gliese}\) 星球的硬件准备,但是 \(\text{sideman}\) 的导航系统还没有完全 ...

  7. [LUOGU] P2245 星际导航

    题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系, ...

  8. 洛谷.2754.星际转移问题(最大流Dinic 分层)

    题目链接 枚举时间 每一个时间点 对于每个之前的位置像当前位置连边,表示这一时刻可待在原地 每艘船 之前时刻位置向当前时刻连边 注意别漏了0时刻src连向earth的边 #include<cst ...

  9. 洛谷P2469 星际竞速

    上下界费用流比较无脑,提供一种更巧妙的费用流,无需上下界. #include <cstdio> #include <algorithm> #include <queue& ...

随机推荐

  1. Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具

    Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...

  2. 第十四章 Spring MVC的工作机制与设计模式(待续)

    Spring MVC的总体设计 Control设计 Model设计 View设计 框架设计的思考 设计模式解析之模版模式

  3. 杀死tomcat进程

    由于tomcat运行时eclipse非法关闭,导致tomcat进程没有关闭,再次启动eclipse,启动tomcat会报tomcat不能启动,且指出端口被占用.笔者解决方案如下: 方案一:重启电脑,简 ...

  4. C#如何生成JSON字符串?(序列化对象)

    第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化对象) 第四章:C#如何生成JSON字符串提交给接口 ...

  5. latex学习

    第一段代码 \documentclass{article} \usepackage{ctex} \begin{document} \section{文字} 特可爱模板 \section{数学} \[ ...

  6. Ros学习调试——rqt_console

    1.rqt_console rqt_console:ROS日志框架(logging framework)的一部分,用来显示节点的输出信息 rqt_logger_level:允许我们修改节点运行时输出信 ...

  7. 用C++的基本算法实现十个数排序

    冒泡排序法 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下 ...

  8. Java3D读取3DMax模型并实现鼠标拖拽、旋转、滚轮缩放等功能

    /**-------------------------------------------------代码区--------------------------------------------- ...

  9. 除了ROS ,机器人自主定位导航还能怎么做?

    博客转载自:https://www.leiphone.com/news/201609/10QD7yp7JFV9H9Ni.html 雷锋网(公众号:雷锋网)按:本文作者科技剪刀手,思岚科技技术顾问. 随 ...

  10. python---pyspider,报错?

    conf.json文件内容如下: { "message_queue": "redis://127.0.0.1:6379/15", "webui&quo ...