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。

说明

对于40% 的数据,满足N≤1000,M≤3000,Q≤1000。

对于 80% 的数据,满足N≤10000,M≤105,Q≤1000。

对于 100% 的数据,满足N≤105,M≤3×105,Q≤105,L≤109。数据不保证没有重边和自环。


真是的,不爱倍增了,拍了好久啊。。

思路:求最小生成树以后打树上倍增

错误点:

倍增跳到同一深度后没有判是否已经相等

堆优化的prim应该不是每次进队都加边

倍增同一深度后向上跳时应该先更新答案再跳(我居然可以错的这么蠢。。)


Code:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=100010;
int head0[N],edge0[N<<1],to0[N<<1],next0[N<<1],cnt0;
void add0(int u,int v,int w)
{
edge0[++cnt0]=w;to0[cnt0]=v;next0[cnt0]=head0[u];head0[u]=cnt0;
}
int head[N],edge[N<<1],to[N<<1],next[N<<1],cnt;
void add(int u,int v,int w)
{
edge[++cnt]=w;to[cnt]=v;next[cnt]=head[u];head[u]=cnt;
}
int used[N],m,n,Q,dep[N],anc[N];
void dfs(int now,int an)
{
used[now]=1;
anc[now]=an;
for(int i=head0[now];i;i=next0[i])
{
int v=to0[i],w=edge0[i];
if(!used[v])
dfs(v,an);
}
}
void init()
{
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
if(!used[i])
{
dfs(i,i);
add0(0,i,0);
}
}
struct node
{
int from,to,w;
bool friend operator <(node n1,node n2)
{
return n1.w>n2.w;
}
node(){}
node(int from,int to,int w)
{
this->from=from;
this->to=to;
this->w=w;
}
};
priority_queue <node > q;
void prim()
{
memset(used,0,sizeof(used));
for(int i=head0[0];i;i=next0[i])
{
int v=to0[i],w=edge0[i];
node tt(0,v,w);
q.push(tt);
}
int cntt=0;
while(!q.empty()&&cntt<n)
{
int u=q.top().to;
if(used[u]) {q.pop();continue;}
add(q.top().from,q.top().to,q.top().w);
add(q.top().to,q.top().from,q.top().w);
used[u]=1;
cntt++;
q.pop();
for(int i=head0[u];i;i=next0[i])
{
int v=to0[i],w=edge0[i];
if(!used[v])
{
node tt(u,v,w);
q.push(tt);
}
}
}
}
int f[N][21],fw[N][21];
void dfs2(int now)
{
used[now]=1;
for(int i=head[now];i;i=next[i])
{
int v=to[i],w=edge[i];
if(!used[v])
{
f[v][0]=now;
fw[v][0]=w;
dep[v]=dep[now]+1;
dfs2(v);
}
}
}
void init2()
{
memset(used,0,sizeof(used));
dfs2(0);
for(int j=1;j<=20;j++)
for(int i=0;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
fw[i][j]=max(fw[i][j-1],fw[f[i][j-1]][j-1]);
}
}
void query(int x,int y)
{
int ans=0;
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(dep[f[x][i]]>=dep[y])
{
ans=max(ans,fw[x][i]);
x=f[x][i];
}
for(int i=20;i>=0;i--)
if(f[x][i]!=f[y][i])
{
ans=max(ans,max(fw[x][i],fw[y][i]));
x=f[x][i],y=f[y][i];
}
if(x!=y)
ans=max(ans,max(fw[x][0],fw[y][0]));
printf("%d\n",ans);
}
int main()
{
freopen("data.out","r",stdin);
freopen("bf.out","w",stdout);
scanf("%d%d",&n,&m);
int u,v,w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add0(u,v,w),add0(v,u,w);
}
init();
prim();
init2();
scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
scanf("%d%d",&u,&v);
if(anc[u]!=anc[v])
printf("impossible\n");
else
query(u,v);
}
return 0;
}

2018.6.30

洛谷 P2245 星际导航 解题报告的更多相关文章

  1. [洛谷P2245]星际导航

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

  2. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  3. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  4. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  5. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  9. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

随机推荐

  1. 大数据入门第二十三天——SparkSQL(二)结合hive

    一.SparkSQL结合hive 1.首先通过官网查看与hive匹配的版本 这里可以看到是1.2.1 2.与hive结合 spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然 ...

  2. 20155207 EXP6 信息搜集与漏洞扫描

    20155207 EXP6 信息搜集与漏洞扫描 基础问题回答 1)哪些组织负责DNS,IP的管理. ICANN统一管理全球根服务器 全球根域名服务器(13台) 地区性注册机构(5个)ARIN RIPE ...

  3. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  4. PostgreSQL基础知识与基本操作索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...

  5. 洛咕 P4491 [HAOI2018]染色

    显然颜色数量不会超过\(lim=\min(m,n/S)\) 考虑容斥,计算恰好出现了\(S\)次的颜色有至少\(i\)种的方案数\(f[i]\),钦定\(i\)种颜色正好放\(S\)种 有\(m\)种 ...

  6. java拦截器(Interceptor)学习笔记

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  7. CM005-逆向分析过程(上篇)

    前言 005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既然变态就分两篇,上篇先实际说流程,到底应该怎么上它,下篇会告诉逆向分析的过程和方法 准备 [环境和工具] win7/xp虚拟机环境 ...

  8. vsftp在防火墙开启需要开放的端口

    1.开放tcp端口 firewall-cmd --zone=public --add-port=20/tcp --permanent firewall-cmd --zone=public --add- ...

  9. RabbitMQ基础教程之基本使用篇

    RabbitMQ基础教程之基本使用篇 最近因为工作原因使用到RabbitMQ,之前也接触过其他的mq消息中间件,从实际使用感觉来看,却不太一样,正好趁着周末,可以好好看一下RabbitMQ的相关知识点 ...

  10. 20135202闫佳歆--week1 计算机是如何工作的

    计算机是如何工作的 这一周我学习了计算机工作的相关知识. 最基础的,就是冯诺依曼体系结构结构,它最核心的思想是存储程序计算机,要点是:数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 除了思想 ...