题目描述

sideman 做好了回到 Gliese星球的硬件准备,但是 sideman 的导航系统还没有完全设计好。为了方便起见,我们可以认为宇宙是一张有 N 个顶点和 M 条边的带权无向图,顶点表示各个星系,两个星系之间有边就表示两个星系之间可以直航,而边权则是航行的危险程度。

sideman 现在想把危险程度降到最小,具体地来说,就是对于若干个询问 (A, B),sideman 想知道从顶点 AA航行到顶点 B 所经过的最危险的边的危险程度值最小可能是多少。作为 sideman 的同学,你们要帮助 sideman返回家园,兼享受安全美妙的宇宙航行。所以这个任务就交给你了。

输入输出格式

输入格式:

第一行包含两个正整数 N 和 M,表示点数和边数。

之后 M 行,每行三个整数 A,B 和 L,表示顶点 A 和 B 之间有一条边长为 L 的边。顶点从 1 开始标号。

下面一行包含一个正整数 Q,表示询问的数目。

之后 Q 行,每行两个整数 A 和 B,表示询问 A 和 B 之间最危险的边危险程度的可能最小值。

输出格式:

对于每个询问, 在单独的一行内输出结果。如果两个顶点之间不可达, 输出 impossible

输入输出样例

输入样例#1: 复制

4 5

1 2 5

1 3 2

2 3 11

2 4 6

3 4 4

3

2 3

1 4

1 2

输出样例#1: 复制

5

4

5

说明

对于 40% 的数据,满足 \(N \leq 1000, M \leq 3000, Q \leq 1000\)。

对于 80% 的数据,满足 \(N \leq 10000, M \leq 10^5, Q \leq 1000\)。

对于 100% 的数据,满足 \(N \leq 10^5, M \leq 3 \times 10^5, Q \leq 10^5, L \leq 10^9\)。数据不保证没有重边和自环。


kruskal重构树

在最小生成树时每次合并两个节点时把它们合并到一个新的点上,这个点的权值就是两点间边的权值



每两个点间的lca就是它们最小路径上的最大值


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define M 300010
#define LL long long
#define RI register int
#define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b)) using namespace std; int m,n,j,k,a[M],ver[M],edge[M],head[M],nex[M],cnt,top[M],wson[M],f[M],s[M],d[M],x,y,z,father[M],cn; struct vv
{
int ver,edge,fr;
} v[M]; inline char gc()
{
static char now[1<<22],*S,*T;
if (T==S)
{
T=(S=now)+fread(now,1,1<<22,stdin);
if (T==S) return EOF;
}
return *S++;
}
inline int gtt()
{
register int x=0,f=1;
register char ch=gc();
while(!isdigit(ch))
{
if (ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=gc();
return x*f;
} inline void ptt(int a)
{
RI b[100], k=a, g=0;
while(k) b[++g]=k%10, k/=10;
for(g;g;g--) putchar(b[g]+48);
} inline bool cmp(vv a,vv b){return a.edge<b.edge;} inline void add(int x,int y)
{
cnt+=1;
ver[cnt]=y; nex[cnt]=head[x]; head[x]=cnt;
} inline int ff(int x)
{
if(father[x]==x) return x;
father[x]=ff(father[x]);
return father[x];
} inline void dfs1(int now,int fa)
{
d[now]=d[fa]+1; f[now]=fa; s[now]=1;
for(RI i=head[now];i;i=nex[i])
{
int t=ver[i];
dfs1(t,now);
if(s[t]>s[wson[now]]) wson[now]=t;
s[now]+=s[t];
}
} inline void dfs2(int now,int topp)
{
top[now]=topp;
if(wson[now]) dfs2(wson[now],topp);
for(RI i=head[now];i;i=nex[i])
{
int t=ver[i];
if(!top[t]) dfs2(t,t);
}
} inline int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(d[top[x]]<d[top[y]])
{
int z=x;
x=y; y=z;
}
x=f[top[x]];
}
return (d[x]>d[y]?y: x);
} inline void kru()
{
for(RI i=1;i<=m;i++)
{
int w=ff(v[i].fr), e=ff(v[i].ver);
if(w!=e)
{
cn+=1;
father[w]=father[e]=cn;
add(cn,w);
add(cn,e);
edge[cn]=v[i].edge;
}
}
} int main()
{
n=gtt(); m=gtt(); cn=n;
for(RI i=1;i<=4*n;i++) father[i]=i;
for(RI i=1;i<=m;i++) {v[i].fr=gtt(); v[i].ver=gtt(); v[i].edge=gtt();}
sort(v+1,v+1+m,cmp);
kru();
dfs1(cn,0);
dfs2(cn,cn);
n=gtt();
for(RI i=1;i<=n;i++)
{
x=gtt(); y=gtt();
if(ff(x)!=ff(y)) puts("impossible");
else ptt(edge[lca(x,y)]), putchar('\n');
}
}

P2245 星际导航的更多相关文章

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

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

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

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

  3. P2245 星际导航 瓶颈路

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

  4. [LUOGU] P2245 星际导航

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

  5. [洛谷P2245]星际导航

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

  6. 最小生成树+LCA【洛谷 P2245】 星际导航

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

  7. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  8. 【洛谷P2245】星际导航

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

  9. Kruskal+LCA【p2245】 星际导航

    Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有\(N\) 个顶点和\(M\) 条边的 ...

随机推荐

  1. 阿里云搭建hadoop集群服务器,内网、外网访问问题(详解。。。)

    这个问题花费了我将近两天的时间,经过多次试错和尝试,现在想分享给大家来解决此问题避免大家入坑,以前都是在局域网上搭建的hadoop集群,并且是局域网访问的,没遇见此问题. 因为阿里云上搭建的hadoo ...

  2. Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件

    1. 使用 crontab -e 命令编辑定时任务列表 使用这个命令编辑的定时任务列表是属于用户级别的,初次编辑后在 /var/spool/cron 目录下生成一个与用户名相同的文件,文件内容就是我们 ...

  3. Angular2学习笔记一

    TypeScript: TypeScript变量声明:let和const是JavaScript里相对较新的变量声明方式,const是对let的一个增强,它能阻止对一个变量再次赋值. var作用域或函数 ...

  4. lua模块化

    main.lua local main = require("my") main.greeting() my.lua local foo = {} local function g ...

  5. FFmpeg实现将图片转换为视频

    ##名称:ffmpeg实现将图片转换为视频 ##平台:ubuntu(已经安装好了ffmpeg工具) ##日期:2017年12月10日 简介: 因为学习需要,需要将连续图片转换成视频,昨天和今天早上用o ...

  6. Java 之常用API(二)

    Object类 & System类 日期相关类 包装类 & 正则表达式 Object类 & System类 1.1 Object类 1.1.1 概述 Object类是Java语 ...

  7. Android开发时,那些相见恨晚的工具或网站!

    本文来我在知乎话题Android开发时你遇到过什么相见恨晚的工具或网站?下的回答! 在实际Android开发过程确实会有很多相见恨晚的工具或网站出现,下面是我自己的一些分享. 1.源码网站 https ...

  8. Vue 框架-03-键盘事件、健值修饰符、双向数据绑定

    Vue 框架-03-键盘时间及健值修饰符 一.键盘事件,当按键盘时,在控制台输出提示 html 源码: <!DOCTYPE html> <html> <head> ...

  9. oracle 用户对象权限

    drop user test cascade;create user test identified by test;grant create session to test;grant create ...

  10. Pig UDF 用户自定义函数

    注册UDF do.pig的内容如下: register /xx/yy.jar data = load 'data'; result = foreach data generate aa.bb.Uppe ...