[洛谷P2245]星际导航
题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少。
解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已。所以具体思路见货车运输。可见两份代码仅有略微差别。
C++ Code:
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cstdio>
using std::sort;
using std::swap;
struct edge{
int u,v,t;
bool operator < (const edge& rhs)const{return t<rhs.t;}
}e[500005];
struct tree_edge{
int to,dist,nxt;
}E[1200005];
int n,m,fa[100005],head[100005]={0},cnt=0,ans,deep[100005],p[100005][19],sml[100005][19];
inline int min(int a,int b){return(a>b)?(a):(b);}
inline int readint(){
char c=getchar();
int p=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())p=(p<<3)+(p<<1)+(c^'0');
return p;
}
int dad(int x){return(fa[x]==x)?(x):(fa[x]=dad(fa[x]));}
inline int addedge(int from,int to,int dist){
E[++cnt]=(tree_edge){to,dist,head[from]};
head[from]=cnt;
E[++cnt]=(tree_edge){from,dist,head[to]};
head[to]=cnt;
}
void dfs(int u){
for(int i=head[u];i;i=E[i].nxt)
if(!deep[E[i].to]){
deep[E[i].to]=deep[u]+1;
p[E[i].to][0]=u;
sml[E[i].to][0]=E[i].dist;
dfs(E[i].to);
}
}
void init(){
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1],sml[i][j]=min(sml[i][j-1],sml[p[i][j-1]][j-1]);
}
int lca(int x,int y,int& ans){
ans=-2000000000;
int i;
if(deep[x]<deep[y])swap(x,y);
for(i=0;(1<<i)<=n;++i);--i;
for(int j=i;j>=0;--j)
if(deep[p[x][j]]>=deep[y]){
ans=min(ans,sml[x][j]),x=p[x][j];
}
if(x==y)return x;
for(int j=i;j>=0;--j)
if(p[x][j]!=p[y][j]&&p[x][j]!=-1){
ans=min(ans,min(sml[x][j],sml[y][j]));
x=p[x][j];
y=p[y][j];
}
ans=min(ans,min(sml[x][0],sml[y][0]));
return p[x][0];
}
int main(){
n=readint(),m=readint();
for(int i=1;i<=m;++i)e[i].u=readint(),e[i].v=readint(),e[i].t=readint();
sort(e+1,e+m+1);
for(int i=1;i<=n;++i)fa[i]=i;
for(int okE=1,now=1;now<=m;++now){
int a=dad(e[now].u),b=dad(e[now].v);
if(a!=b){
fa[b]=a;
addedge(e[now].u,e[now].v,e[now].t);
++okE;
}
if(okE==n)break;
}
int Q=readint();
memset(deep,0,sizeof deep);
memset(p,-1,sizeof p);
memset(sml,0x3f,sizeof sml);
for(int i=1;i<=n;++i)
if(!deep[i]){
deep[i]=1;
dfs(i);
}
init();
while(Q--){
int x=readint(),y=readint();
int a=dad(x),b=dad(y);
if(a!=b){
puts("impossible");
continue;
}
lca(x,y,ans);
printf("%d\n",ans);
}
}
[洛谷P2245]星际导航的更多相关文章
- 洛谷 P2245 星际导航 解题报告
P2245 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向 ...
- 最小生成树+LCA【洛谷 P2245】 星际导航
[洛谷 P2245] 星际导航 题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边 ...
- 【洛谷P2245】星际导航
题面 题解 \(kruskal\)重构树板子题??(大雾 因为重构树上两点之间的\(LCA\)的权值就是原图上最小生成树上的瓶颈. 所以建个重构树,跑\(LCA\)即可. 代码 #include< ...
- 【luogu P2245 星际导航】 题解
题目链接:https://www.luogu.org/problemnew/show/P2245 = 货车运输 被逼着写过mst+lca 后来成了mst+树剖 #include <cstdio& ...
- 洛谷.2754.星际转移问题(最大流Dinic 分层)
题目链接 枚举时间 每一个时间点 对于每个之前的位置像当前位置连边,表示这一时刻可待在原地 每艘船 之前时刻位置向当前时刻连边 注意别漏了0时刻src连向earth的边 #include<cst ...
- 洛谷P2469 星际竞速
上下界费用流比较无脑,提供一种更巧妙的费用流,无需上下界. #include <cstdio> #include <algorithm> #include <queue& ...
- P2245 星际导航
题目描述 sideman 做好了回到 Gliese星球的硬件准备,但是 sideman 的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有 N 个顶点和 M 条边的带权无向图,顶点表示 ...
- P2245 星际导航 瓶颈路
\(\color{#0066ff}{ 题目描述 }\) sideman 做好了回到 \(\text{Gliese}\) 星球的硬件准备,但是 \(\text{sideman}\) 的导航系统还没有完全 ...
- [LUOGU] P2245 星际导航
题目描述 sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系, ...
随机推荐
- sts安装出现could not find jar:file解决办法,could not find jar:file,sts安装
标题sts插件下载好但是安装出错 我的eclipse是4.5.2,在官方网站https://spring.io/tools3/sts/legacy下载,压缩包的名字为:spring-tool-suit ...
- POJ 3268 Dijkstra+priority_queue或SPFA
思路:正向建边,一遍Dijkstra,反向建边,再一遍Dijkstra.ans加在一起输出最大值. (SPFA也行--) // by SiriusRen #include <queue> ...
- mybatis的sql中字段两种映射(映射到实体)方式
mybatis的xml配置文件中,字段映射的两种方式: 1.resultMap标签中将数据库的字段与实体类中的字段对应: <resultMap id="BaseResultMap&qu ...
- 51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)
代码: 题意,第一个数为0,相邻的数相差0或者1,有一些点有限制,不大于给定值,求这组数中可能的最大的那个数. 这题我们看一个例子:第5个数的限制为2 1 2 3 4 5 6 7 8 9 0 1 2 ...
- freemarker加载模板文件的
java代码: public String getContent(String name, HashMap<String, Object> paramMap) { //home 文件路径 ...
- [APIO2012]派遣 可并堆(左偏树)
没啥说的,自底向上合并大根堆即可. 一边合并,一边贪心弹堆顶直到堆的总和不大于预算. Code: #include <cstdio> #include <algorithm> ...
- Linux下编译,安装Apache httpd服务器
环境:ubuntu 16.0.4 Apache官网下载Apache httpd压缩包:httpd-2.4.27.tar.gz,安装之前请确定安装了make工具,我安装的是GNU make 解压文件 s ...
- session 超时跳转登陆页面
/** * session超时跳转登陆页面 * @author zhangdong * 2017年10月24日 */ @Aspect @Component public class SessionTi ...
- django 之数据库模块
前提ajango的 数据库主要是为了存取网站的一些内容,数据库的设置一般放在model.py 下 目录下 我们设置如下的数据库:具体的代码如下面所示: # -*- coding: utf-8 -* ...
- 紫书 例题8-13 UVa 11093 (反证法)
这道题发现一个性质就解决了 如果以i为起点, 然后一直加油耗油, 到p这个地方要去p+1的时候没油了, 那么i, i+1, --一直到p, 如果以这些点 为起点, 肯定也走不完. 为什么呢? 用反证法 ...