UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少?
求最小瓶颈路,既是求最小生成树。因为要处理多组询问,所以需要用倍增加速。
先处理出最小生成树,prim的时间复杂度为O(n*n),kruskal为O(mlogm)。前者适合处理稠密图,后者适合处理稀疏图。
这里的倍增处理是值得记住的,在树上做多组询问;亦或是,将无向图缩点在询问,都是可以这样加速的。
注意:边权<=1e9
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define clr(a,m) memset(a,m,sizeof(a))
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int MAXN=;
const int INF=1e9;
const int POW =; struct Edge{
int u,v,c;
bool operator < (const Edge rhs)const {
return c>rhs.c;
}
}; priority_queue<Edge>q;
vector<int>G[MAXN];
vector<Edge>edge; int fa[MAXN]; int p[MAXN][POW],Max[MAXN][POW],d[MAXN]; void init(int n)
{
while(!q.empty())
q.pop(); edge.clear();
rep(i,,n)
G[i].clear();
} void add(int u,int v,int c)
{
edge.push_back((Edge){u,v,c});
int m=edge.size();
G[u].push_back(m-);
} int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
} void kruskal(int n)
{
int ans=,cnt=;
rep(i,,n)
fa[i]=i;
while(!q.empty())
{
Edge e=q.top();q.pop();
int x=find(e.u);
int y=find(e.v);
if(x!=y){
ans+=e.c;
fa[x]=y;
add(e.u,e.v,e.c);
add(e.v,e.u,e.c);
}
}
} void dfs(int u,int fa,int c)
{
d[u]=d[fa]+;
p[u][]=fa;
Max[u][]=c; rep(i,,POW-){//写rep的原因,忘记-1了,又因为数组开的[POW],下标越界了,不过返回wa实在很无语
p[u][i]=p[p[u][i-]][i-];
Max[u][i]=max(Max[u][i-],Max[p[u][i-]][i-]);//注意下标...写顺手写成Max[Max[u][i-1]][i-1]
}
int sz=G[u].size();
rep(i,,sz-){
Edge e=edge[G[u][i]];
if(e.v==fa)
continue;
dfs(e.v,u,e.c);
}
} int lca( int a, int b )
{
int ans=-INF;
if( d[a] > d[b] ) a ^= b, b ^= a, a ^= b;
if( d[a] < d[b] ){
int del = d[b] - d[a];
for( int i = ; i < POW; i++ )
if(del&(<<i)){
ans=max(ans,Max[b][i]);//注意处理顺序,先取最值,在更新当前点
b=p[b][i];
}
}
if( a != b ){
for( int i = POW-; i >= ; i-- )
if( p[a][i] != p[b][i] ){
ans=max(ans,Max[a][i]);
ans=max(ans,Max[b][i]);
a = p[a][i];
b = p[b][i];
}
ans=max(ans,Max[a][]);
ans=max(ans,Max[b][]);
a = p[a][];
b = p[b][];
}
return ans;
} void LCA(int n)
{
int x,u,v;
clr(p,);
d[]=;
dfs(,,); scanf("%d",&x);
rep(i,,x){
scanf("%d%d",&u,&v);
printf("%d\n",lca(u,v));
}
} int main()
{
int n,m,cnt=;
int u,v,c;
while(~scanf("%d%d",&n,&m))
{
if(cnt++)puts("");
init(n);
rep(i,,m){
scanf("%d%d%d",&u,&v,&c);
q.push((Edge){u,v,c});
}
kruskal(n);
LCA(n);
}
return ;
}
/*
9 8
1 2 10
1 3 20
2 4 20
2 5 30
3 6 30
3 7 10
4 8 30
5 9 10
36
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
2 3
2 4
2 5
2 6
2 7
2 8
2 9
3 4
3 5
3 6
3 7
3 8
3 9
4 5
4 6
4 7
4 8
4 9
5 6
5 7
5 8
5 9
6 7
6 8
6 9
7 8
7 9
8 9
*/
UVA 11354 Bond(最小瓶颈路+倍增)的更多相关文章
- UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)
题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...
- UVa 11354 邦德(最小瓶颈路+LCA)
https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...
- 最小瓶颈路 Uva 534 Frogger
说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...
- 【uva 534】Frogger(图论--最小瓶颈路 模版题)
题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...
- CF600 div2 F.Cheap Robot(思维+最短路+最小瓶颈路)
最开始啃这题的时候我还是个不会$lca$的人,看代码看的没有一点头绪,现在趁着寒假补了很多关于图论的知识点,回头在看这题还是有很多值得学习的地方. Solution 1 (offline): 原题解: ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- uva 11354 - Bond(树链拆分)
题目链接:uva 11354 - Bond 题目大意:给定一张图.每次询问两个节点路径上进过边的危急值的最大值的最小值. 解题思路:首先建立最小生成数,然后依据这棵树做树链剖分. #include & ...
- 【UVA534】Frogger 最小瓶颈路
题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...
- 【20181102T2】飞越行星带【智商题+最小瓶颈路】
题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...
随机推荐
- 【DP】BZOJ 1260: [CQOI2007]涂色paint
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 893 Solved: 540[Submit][Stat ...
- 6 个基于 jQuery 的表单向导插件推荐
表单向导可以很好地引导用户进行一步一步的操作,从而降低用户错误输入的几率.尽管互联网中有大量的类似插件,但真正好用的不多. 本文整理了6个比较优秀的表单向导插件,希望能够为你带来帮助. 1. Smar ...
- Amazon Interview Question: Design an OO parking lot
Design an OO parking lot. What classes and functions will it have. It should say, full, empty and al ...
- springmvc环境的搭建
最近应公司要求,用了2天时间学了springmvc的搭建,就简单总结一下: springmvc和struts2的比较,因为我是学过struts的,它们都是基于mvc模式而设计的web层框架 它们最大的 ...
- JavaWeb项目开发案例精粹-第3章在线考试系统-004Service层
1. package com.sanqing.service; import java.util.List; import com.sanqing.po.Student; public interfa ...
- 浅析Quartz的集群配置
浅析Quartz的集群配置(一) 收藏人:Rozdy 2015-01-13 | 阅:1 转:22 | 来源 | 分享 1 基本信息 摘要:Quar ...
- *Linux之rpm命令
在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比"添加/删除程序"强很多,它就是Red Hat Package Mana ...
- 244. Shortest Word Distance II
题目: This is a follow up of Shortest Word Distance. The only difference is now you are given the list ...
- NSPoint
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasep ...
- Java API —— ArrayList类 & Vector类 & LinkList类
1.ArrayList类 1)ArrayList类概述 · 底层数据结构是数组,查询快,增删慢 · 线程不安全,效率高 2)ArrayList案例 ...