题目大意:给出一个无向边,非常多询问,问x,y两地之间的最长路最短是多少。

思路:乍一看好像是二分啊。

的确这个题二分能够做。可是时间会慢非常多,有的题直接就T掉(NOIP2013货车运输)。

事实上这个题的模型就是最小瓶颈路模型。

解法就是把无向图变成一个最小生成树,然后两点之间的最长路就是满足题意的答案。

CODE:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 15010
#define INF 0x7f7f7f7f
using namespace std; struct Complex{
int x,y,len; bool operator <(const Complex &a)const {
return len < a.len;
}
void Read() {
scanf("%d%d%d",&x,&y,&len);
}
}edge[MAX << 2]; int points,edges,asks;
int head[MAX],total;
int next[MAX << 1],length[MAX << 1],aim[MAX << 1]; int fa[MAX]; int deep[MAX];
int father[MAX][20],min_length[MAX][20]; void Pretreatment();
int Find(int x); inline void Add(int x,int y,int len); void DFS(int x,int last);
void SparseTable(); int GetLCA(int x,int y); int main()
{
cin >> points >> edges >> asks;
Pretreatment();
for(int i = 1;i <= edges; ++i)
edge[i].Read();
sort(edge + 1,edge + edges + 1);
for(int i = 1;i <= edges; ++i) {
int fx = Find(edge[i].x);
int fy = Find(edge[i].y);
if(fx != fy) {
Add(edge[i].x,edge[i].y,edge[i].len);
Add(edge[i].y,edge[i].x,edge[i].len);
fa[fx] = fy;
}
}
DFS(1,0);
SparseTable();
for(int x,y,i = 1;i <= asks; ++i) {
scanf("%d%d",&x,&y);
printf("%d\n",GetLCA(x,y));
}
return 0;
} void Pretreatment()
{
for(int i = 1;i <= points; ++i)
fa[i] = i;
} int Find(int x)
{
if(fa[x] == x) return x;
return fa[x] = Find(fa[x]);
} inline void Add(int x,int y,int len)
{
next[++total] = head[x];
aim[total] = y;
length[total] = len;
head[x] = total;
} void DFS(int x,int last)
{
deep[x] = deep[last] + 1;
for(int i = head[x];i;i = next[i]) {
if(aim[i] == last) continue;
father[aim[i]][0] = x;
min_length[aim[i]][0] = length[i];
DFS(aim[i],x);
}
} void SparseTable()
{
for(int j = 1;j < 20; ++j)
for(int i = 1;i <= points; ++i) {
father[i][j] = father[father[i][j - 1]][j - 1];
min_length[i][j] = max(min_length[i][j - 1],min_length[father[i][j - 1]][j - 1]);
}
} int GetLCA(int x,int y)
{
int re = 0;
if(deep[x] < deep[y]) swap(x,y);
for(int i = 19;i >= 0; --i)
if(deep[father[x][i]] >= deep[y]) {
re = max(re,min_length[x][i]);
x = father[x][i];
}
if(x == y) return re;
for(int i = 19;i >= 0; --i)
if(father[x][i] != father[y][i]) {
re = max(re,min_length[x][i]);
re = max(re,min_length[y][i]);
x = father[x][i];
y = father[y][i];
}
re = max(re,min_length[x][0]);
re = max(re,min_length[y][0]);
return re;
}

BZOJ 3732 Network 最小瓶颈路的更多相关文章

  1. 最小瓶颈路 Uva 534 Frogger

    说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...

  2. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

  3. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  4. 【UVA534】Frogger 最小瓶颈路

    题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...

  5. 【20181102T2】飞越行星带【智商题+最小瓶颈路】

    题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...

  6. UVa 11354 邦德(最小瓶颈路+LCA)

    https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...

  7. 【UVA10816】Travel in Desert (最小瓶颈路+最短路)

    UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...

  8. HDU4081:Qin Shi Huang's National Road System (任意两点间的最小瓶颈路)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  9. P1396 营救(最小瓶颈路)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

随机推荐

  1. 关于php使用xpath解析html中文乱码问题

    $str2 = '<div id="content">我很好 </div>'; $dom = new DOMDocument(); //load之前强转字符 ...

  2. Java面试——String、StringBuider以及StringBuffer的区别和使用场景

    1.  String.StringBuider.StringBuffer的区别  String是不可变的对象,因此在每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指 ...

  3. LA 4256 DP Salesmen

    d(i, j)表示使前i个数满足要求,而且第i个数值为j的最小改动次数. d(i, j) = min{ d(i-1, k) | k == j | G[j][k] } #include <cstd ...

  4. 关于加号传递到后端会变为空格的c#例子

    参考博客:http://blog.csdn.net/nsdnresponsibility/article/details/50965262 以前在一次传递参数的情况中遇到,特此记录一下. 之前传递的参 ...

  5. 开始 python programming第三版案例分析

    最近研究python,打算将python programming第三版案例分析下 但是全书1600多页 比较费时 而且 介绍太多 感觉没有必要! python programming 堪称经典之作 第 ...

  6. sqoop导数据出现问题

    执行下面命令的时候报错 ./sqoop import \ --connect jdbc:mysql://mini1:3306/userdb \ --username root \ --password ...

  7. Leetcode 354.俄罗斯套娃信封问题

    俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...

  8. Ubuntu Flask安装与配置(待整理)

    工作中开发需要用到python的flask框架,无奈网络上的资源很少,连基本的安装和配置都不全,在这做一下整理,方便以后用到. ———————————————————————————— 由于比较繁琐, ...

  9. [UOJ#221][BZOJ4652][Noi2016]循环之美

    [UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...

  10. 【CCF】棋局评估

    博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...