给你N个点的无向图 ( <= N <= ,),记为:…N。
图中有M条边 ( <= M <= ,) ,第j条边的长度为: d_j ( < = d_j < = ,,,). 现在有 K个询问 ( < = K < = ,)。
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? Input
第一行: N, M, K。
第2..M+1行: 三个正整数:X, Y, and D ( <= X <=N; <= Y <= N). 表示X与Y之间有一条长度为D的边。
第M+..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? Output
对每个询问,输出最长的边最小值是多少。 Sample Input Sample Output Hint
<= N <= , <= M <= , <= d_j <= ,,, <= K <= ,

题意:给定N点M边的无向图,每边有权值,Q次询问,每次询问给出u、v,回答u到v的所有路径中最大边的最小值。

思路:常识可知,需要最小生成树,然后就是最小生成树两点间的最大值。

可以用树剖+线段树解决 。或者动态树LCT姿势搞定。

(写LCT写惯了就不想写树剖了有没有

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
struct egde{
int x,y,val;
}e[maxn];
void read(int &x){
char c=getchar(); x=;
for(;c>''||c<'';c=getchar());
for(;c<=''&&c>='';c=getchar()) x=(x<<)+(x<<)+c-'';
}
struct LCT
{
int Max[maxn],rev[maxn],ch[maxn][],fa[maxn],stc[maxn],top;
int isroot(int x){
return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
}
int get(int x){
return ch[fa[x]][]==x;
}
void pushdown(int x)
{
if(!rev[x]||!x) return ;
swap(ch[x][],ch[x][]);
if(ch[x][]) rev[ch[x][]]^=;
if(ch[x][]) rev[ch[x][]]^=;
rev[x]=;
}
void pushup(int x)
{
Max[x]=x;
if(ch[x][]&&e[Max[ch[x][]]].val>e[Max[x]].val) Max[x]=Max[ch[x][]];
if(ch[x][]&&e[Max[ch[x][]]].val>e[Max[x]].val) Max[x]=Max[ch[x][]];
}
void rotate(int x)
{
int old=fa[x],fold=fa[old],opt=get(x);
if(!isroot(old)) ch[fold][get(old)]=x;
fa[x]=fold;
ch[old][opt]=ch[x][opt^]; fa[ch[old][opt]]=old;
ch[x][opt^]=old; fa[old]=x;
pushup(old); pushup(x);
}
void splay(int x)
{
int top=; stc[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) stc[++top]=fa[i];
for(int i=top;i;i--) pushdown(stc[i]);
for(int f;!isroot(x);rotate(x)){
if(!isroot(f=fa[x]))
rotate(get(x)==get(f)?f:x);
}
}
void access(int x)
{
int rson=;
for(;x;rson=x,x=fa[x]){
splay(x);
ch[x][]=rson;
pushup(x);
}
}
int find(int x){ access(x); splay(x); while(ch[x][]) x=ch[x][]; return x;}
int query(int x,int y) { make_root(y); access(x); splay(x); return Max[x]; }
void make_root(int x) { access(x); splay(x); rev[x]^=; }
void link(int x,int y) { make_root(x); fa[x]=y; splay(x); }
void cut(int x,int y) { make_root(x); access(y); splay(y); fa[x]=ch[y][]=; } }S;
int main()
{
int N,M,Q,u,v,i;
scanf("%d%d%d",&N,&M,&Q);
for(i=;i<=M;i++){
read(e[i].x); read(e[i].y) ;read(e[i].val);
if(S.find(M+e[i].x)!=S.find(M+e[i].y)){
S.link(i,M+e[i].x); S.link(i,M+e[i].y);
}
else {
int tmp=S.query(M+e[i].x,M+e[i].y);
if(e[tmp].val>e[i].val){
S.cut(tmp,M+e[tmp].x); S.cut(tmp,M+e[tmp].y);
S.link(i,M+e[i].x); S.link(i,M+e[i].y);
}
}
}
while(Q--){
read(u); read(v);
printf("%d\n",e[S.query(M+u,M+v)].val);
}
return ;
}

最新文章

  1. [转] 给ubuntu中的软件设置desktop快捷方式(以android studio为例)
  2. Python matplotlib笔记
  3. Java实现多种方式的http数据抓取
  4. Spring框架学习(一)
  5. Java MD5加密工具类
  6. Struts2的使用以及Spring整合Struts2
  7. 建置 POSTFIX 服务器
  8. C#部分---利用arraylist集合做滚动抽奖;
  9. XML和HTML常用转义字符
  10. Mantis Administrator控制密码、注册不用邮件验证、添加测试员[Z]
  11. mybatis.generator.configurationFile
  12. IK分词器 IKAnalyzer 简单demo
  13. 导出Excel1 - 项目分解篇
  14. django(七)之数据库表的单表-增删改查QuerySet,双下划线
  15. leetCode27.移除元素
  16. BZOJ 3771 Triple FFT+容斥原理
  17. Linux网络之设备接口层:发送数据包流程dev_queue_xmit
  18. 概率法计算PI
  19. 查看Linux 、Nginx、 MySQL 、 PHP 版本的方法
  20. SpringData_PagingAndSortingRepository接口

热门文章

  1. [POJ2443]Set Operation(bitset)
  2. hdu 4639
  3. 【POJ3294】Life Forms(后缀数组,二分)
  4. django学习之- 动态验证码学习
  5. HDU 4193 Non-negative Partial Sums【单调队列】
  6. CodeForces 597A Divisibility
  7. Max Sum Plus Plus-HDU1024(dp)
  8. Topcoder 658Div2
  9. 【.Net Core 学习系列】-- EF Core 实践(Code First)
  10. 我在使用eclipse配置Tomcat服务器的时候发现,默认情况下Tocmat把我们部署的项目放在了workspaces下面,而不是像Myeclipse默认的那样放在tomcat的安装路径下。