这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题

  直接先甩题目

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 

  这道题比较困难的是如何想出可行解法,题目中说最大权边最小,而又有很多询问,所以二分答案肯定不行,所以考虑使用一些奇怪的技巧,

  我们知道两点之间的这条最大值最小的路径是唯一的,所以我们可以从这方面入手。

  显然的,通过一些基本证明,我们可以得知我们要求的实际上是最小生成树,那么既然已经有树形结构了,那么两点之间的路径可以通过LCA轻易的找到,用倍增即可维护最值

  直接给出代码

 #include<stdio.h>
#include<algorithm>
using namespace std;
struct shit{
int aim,from,lon,next;
}e[],s[];
struct ass{
int fat,mx;
}f[][];
int point,dep[],fa[],fff[],cnt,head[],n,m,k;
bool vis[];
int LCA_(int x,int y)
{
int mather_fucker=;
if(dep[x]>dep[y])swap(x,y);
for(int i=;~i;--i)
if(dep[f[i][y].fat]>=dep[x])
{
mather_fucker=max(mather_fucker,f[i][y].mx);
y=f[i][y].fat;
}
if(y==x)return mather_fucker;
for(int i=;~i;--i)
if(f[i][y].fat!=f[i][x].fat){
mather_fucker=max(mather_fucker,max(f[i][y].mx,f[i][x].mx));
y=f[i][y].fat;
x=f[i][x].fat;
}
mather_fucker=max(mather_fucker,max(f[][y].mx,f[][x].mx));
return mather_fucker;
}
void fuck(int x,int y,int z)
{
e[++point].aim=y;e[point].from=x;e[point].lon=z;e[point].next=head[x];head[x]=point;
e[++point].aim=x;e[point].from=y;e[point].lon=z;e[point].next=head[y];head[y]=point;
}
void get(int w,int x,int y,int z)
{
s[w].aim=y,s[w].from=x,s[w].lon=z;
}
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool cmp(shit x,shit y)
{
if(x.lon<y.lon)return true;
else return false;
}
void work(int x,int d)
{
dep[x]=d;
vis[x]=true;
for(int i=head[x];i;i=e[i].next)
{
int u=e[i].aim;
if(vis[u])continue;
f[][u].fat=x;
f[][u].mx=e[i].lon;
work(u,d+);
}
}
int main()
{
int a,b,c;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
get(i,a,b,c);
}
for(int i=;i<=n;i++)fa[i]=i;
sort(s+,s+m+,cmp);
for(int i=;i<=m;++i)
{
a=find(s[i].aim);
b=find(s[i].from);
if(a==b)continue;
fa[a]=b;
fuck(a,b,s[i].lon);
++cnt;
if(cnt==n-)break;
}
f[][n/].fat=n/,f[][n/].mx=,dep[n/]=,vis[n/]=true;
work(n/,);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
{
f[i][j].fat=f[i-][f[i-][j].fat].fat;
f[i][j].mx=max(f[i-][j].mx,f[i-][f[i-][j].fat].mx);
}
for(int i=;i<=k;++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",LCA_(a,b));
}
return ;
}

最新文章

  1. ios crash的原因与抓取crash日志的方法
  2. IOS UI多线程 NSThread 下载并显示图片到UIImageView
  3. Java面试(2)-- Java算数表达式
  4. POJ2796Feel Good[单调栈]
  5. 关于imp无法导出空表
  6. LINUX安全设置
  7. yii1.1.3主从(多从)、读写分离配置
  8. C#裁剪照片并保存
  9. APUE第4章 文件和目录
  10. Library工程No resource identifier found for attribute
  11. jsoup:解析HTML用法小结
  12. python模块学习 hashlib
  13. Java基础知识强化26(1):Object类之Object类的概述
  14. vmware中网络连接方式介绍
  15. iOS多线程开发之离不开的GCD(上篇)
  16. 避免&quot;Physics Space Locked&quot;错误
  17. Spring Cloud中服务的发现与消费
  18. 转:彻底搞清楚javascript中的require、import和export
  19. 解决pre-commit hook failed (add --no-verify to bypass)的问题
  20. Flume架构以及应用介绍

热门文章

  1. 使用MS VS的命令来编译C++程序
  2. HihoCoder - 1615矩阵游戏II(贪心)
  3. 【SQL】分组数据,过滤分组-group by , having
  4. ASP.NET中服务器控件的生命周期
  5. Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
  6. python操作RabbitMQ(不错)
  7. openfaas 了解
  8. 使用.NET Remoting开发分布式应用——基于租约的生存期
  9. Oracle终极数据恢复,孰弱孰强(DUL vs AUL)
  10. Eclipse自动生成 get/set