洛谷 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。
说明
对于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 星际导航 解题报告的更多相关文章
- [洛谷P2245]星际导航
题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 [HNOI2014]道路堵塞 解题报告
[HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...
随机推荐
- jQuery.bsgrid
http://thebestofyouth.com/bsgrid/ 支持json.xml数据格式,皮肤丰富并且容易定制,支持表格编辑.本地数据.导出参数构建等实用便捷的功能,容易扩展,更拥有丰富的示例 ...
- 牛客练习赛44 B题 (思维)
链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 给出n条线段,第i条线段的长度为ai, 每次可以从第i条线段的j位置跳到第i + 1条线段的j+ ...
- 在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法
原文:在ListBoxItem的样式中的button传参,把当前选中项传递到命令的方法 前端页面: <Style x:Key="ThumbItemStyle" TargetT ...
- ElasticSearch入门 第三篇:索引
这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- js获取浏览器对象的信息
js中有一个对象叫 navigator,navigator 对象包含有关浏览器的信息.所有的浏览器都支持该对象. 其中经常用到的是 navigator.userAgent 属性,通常,它是在 navi ...
- 通过拓展Function.prototype实现一个AOP
AOP(面向切面的编程)主要是将一些与核心业务逻辑模块无关的功能抽离出来,这些功能通常包括日志统计,安全控制,或者是异常处理等等. 我们要做的就是拓展Function.prototype来“动态植入” ...
- CSAPP lab2 二进制拆弹 binary bombs phase_6
给出对应于7个阶段的7篇博客 phase_1 https://www.cnblogs.com/wkfvawl/p/10632044.htmlphase_2 https://www.cnblogs. ...
- 《linux内核分析》第一周(2.22~2.28)
潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的? ...
- Python网络数据采集二
一.正则表达式 * 表匹配0次或者多次 a*b* + 表至少一次 [ ] 匹配任意一个 ( ) 辨识一个编组 {m,n} m或者n 次 [^] 匹配任意不在中括号里的字符 | ...
- GITHUB使用及入门总结
这是我第一次应用git,以下仅供git的初学者参考. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说 ...