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\) ...
随机推荐
- 2186: [Sdoi2008]沙拉公主的困惑 - BZOJ
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- fork 函数 和vfork 函数的区别
问题描述: fork 函数 和vfork 函数的区别 问题解决: fork函数使用: 注: 以上printf 属于标准IO库带缓冲,如果标准输出链接到终端设备,则它是行 ...
- HTTP 错误 403.14 - Forbidden
在打开一个网站时,显示HTTP 错误 403.14 - Forbidden 是一件很不幸的事情.我这几天打开某网站就出现了这个问题.Web 服务器被配置为不列出此目录的内容,错误代码0x0000000 ...
- 【WCF--初入江湖】10 序列化和传输大型数据流
10 序列化和传输大型数据流 1.前言 理解WCF的序列化形式 掌握DataContractSerializer序列化对象 比较性能 比较xmlSerializer序列化对象 大数据量传输设置 修 ...
- MySQL 语句级避免重复插入—— Insert Select Not Exist
想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法. INSERT INTO table(column1,column2,column3 ...columnN) SELE ...
- 1829 A Bug's Life
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- ActiveMQ 学习笔记
http://somebody-hjh.iteye.com/blog/726050 一.概述 Message,即消息.人与人之间通过消息传递信息.言语.眼神.肢体动作都可被视为消息体.当然还有我们经常 ...
- KDE/QT与GNOME/GTK比较
转自:http://linux.chinaunix.net/bbs/thread-1125240-1-1.html 虽然在商业方面存在竞争,GNOME与KDE两大阵营的开发者关系并没有变得更糟,相反他 ...
- linux下centos安装android sdk最新全面教程【可行】
1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新ja ...
- 一个小应用的dbcp和c3p0配置实例
以下是一个小应用的数据库连接池配置,包括DBCP和C3P0的配制方法 因为是小应用,完全不涉及访问压力,所以配置上采取尽量节约数据库资源的方式 具体要求如下:初始化连接数为0连接不够,需要新创建时,每 ...