Description

给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。 
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).

现在有 K个询问 (1 < = K < = 15,000)。 
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Input

第一行: N, M, K。 
第2..M+1行: 三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N). 表示X与Y之间有一条长度为D的边。 
第M+2..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?

Output

对每个询问,输出最长的边最小值是多少。

Sample Input

6 6 8
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1

Sample Output

5
5
5
4
4
7
4
5

HINT

1 <= N <= 15,000

1 <= M <= 30,000

1 <= d_j <= 1,000,000,000

1 <= K <= 15,000

Source

找到一个最小生成树,然后lca就好。。。肉眼查错大法好。。
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define M 30010
#define N 15010
#define inf 0x7fffffff
using namespace std;
struct node1{int x,y,v;}d[M];
struct node2{int next,v,to;}e[M];
int n,m,k,cnt;
int fa[N][],fa_max[N][],belong[N],dpt[N],head[N];
inline int read() {char c; int ans=; while ((c=getchar())==' ' || c=='\n' || c=='\r'); ans=c-''; while (isdigit(c=getchar())) ans=ans*+c-''; return ans;}
bool cmp(node1 a,node1 b){return a.v<b.v;}
void adde(int x,int y,int z) {cnt++; e[cnt].next=head[x]; head[x]=cnt; e[cnt].to=y; e[cnt].v=z;}
int findfa(int x)
{
if (!belong[x] || belong[x]==x) return belong[x]=x;
else return belong[x]=findfa(belong[x]);
}
void bfework(int x)
{
dpt[x]=dpt[fa[x][]]+;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==fa[x][]) continue;
fa[e[i].to][]=x;
fa_max[e[i].to][]=e[i].v;
bfework(e[i].to);
}
}
int query(int x,int y)
{
int ans=-inf;
if (dpt[x]<dpt[y]) swap(x,y);
for (int i=;~i;i--)
if (dpt[fa[x][i]]>=dpt[y])
ans=max(ans,fa_max[x][i]),x=fa[x][i];
if (x==y) return ans;
for (int i=;~i;i--)
if (fa[x][i]!=fa[y][i])
{
ans=max(max(fa_max[x][i],fa_max[y][i]),ans);
x=fa[x][i];
y=fa[y][i];
}
ans=max(max(fa_max[x][],fa_max[y][]),ans);
return ans;
}
int main()
{
n=read(); m=read(); k=read();
for (int i=;i<=m;i++) {d[i].x=read(); d[i].y=read(); d[i].v=read();}
sort(d+,d+m+,cmp);
for (int i=;i<=m;i++)
{
int fax=findfa(d[i].x),fay=findfa(d[i].y);
if (fax!=fay)
{
belong[fax]=fay;
adde(d[i].x,d[i].y,d[i].v);
adde(d[i].y,d[i].x,d[i].v);
}
}
bfework();
for (int i=;i<=;i++)
for (int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-],fa_max[j][i]=max(fa_max[j][i-],fa_max[fa[j][i-]][i-]);
for (int i=;i<=k;i++)
{
int x,y;
x=read(); y=read();
printf("%d\n",query(x,y));
}
// for (int i=1;i<=n;i++) printf("%d ",dpt[i]);
// printf("%d ",fa_max[5][1]);
return ;
}

【BZOJ3732】 Network Kruskal+倍增lca的更多相关文章

  1. BZOJ 3732 Network Kruskal+倍增LCA

    题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...

  2. 【bzoj3732】Network 最小生成树+倍增LCA

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  3. BZOJ 4144 Dijkstra+Kruskal+倍增LCA

    思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...

  4. BZOJ 3732 Network —— 最小生成树 + 倍增LCA

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...

  5. cf827D Best Edge Weight (kruskal+倍增lca+并查集)

    先用kruskal处理出一个最小生成树 对于非树边,倍增找出两端点间的最大边权-1就是答案 对于树边,如果它能被替代,就要有一条非树边,两端点在树上的路径覆盖了这条树边,而且边权不大于这条树边 这里可 ...

  6. BZOJ3732: Network(Kruskal重构树)

    题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...

  7. cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)

    先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 #include<bits/stdc++.h> # ...

  8. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  9. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

随机推荐

  1. xml解析方法总结

    ==========================================xml文件<?xml version=”1.0″ encoding=”GB2312″?> <RES ...

  2. 分佈式事務故障處理暨ORA-24756: transaction does not exist處理

    ORA-24756处理 看到警告日誌一直報ORA-24756錯誤 Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc: O ...

  3. iOS 随记

    UIImage 走缓存 + (UIImage *)imageNamed:(NSString *)name; 不走缓存 + (UIImage *)imageWithContentsOfFile:(NSS ...

  4. 调整vbox虚拟机下的linux全屏模式及分辨率

    >>Step1 在VirtualBox菜单栏中选择[设备]->[安装增强功能] >>Step2 点击右上角的[齿轮]图标,然后选择[Log Out],重新登录即可 lin ...

  5. JAVA的容器---List,Map,Set (转)

    JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashM ...

  6. ZEALER背后的乐视云视频

    ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...

  7. 用 C# 实现一个简单的 Rest Service 供外部调用

    用 C#  实现一个简单的 Restful Service 供外部调用,大体总结为4点: The service contract (the methods it offers). How do yo ...

  8. Apache Kafka for Item Setup

    At Walmart.com in the U.S. and at Walmart's 11 other websites around the world, we provide seamless ...

  9. HDU 3461 Code Lock(并查集)

    很好的一个题,思想特别6 题意:给你小写字母个数n,每个字母可以向上翻动,例如:d->c,a->z.然后给你m对数(L,R)(L<=R),表示[L,R]之间可以同时向上翻动,且翻动后 ...

  10. JAVA Day7

    6  方法   1.格式[访问控制符] void返回值类型 方法名(参数列表:数据类型 参数名); 2.类的方法: *用来定义类的某种行为或功能 * 3.方法的返回值 *如果有返回值,方法中必须要使用 ...