当前位置: 首页 > news >正文

BZOJ-3732: Network (kruskal+LCA)

3732: Network

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2092  Solved: 998
[Submit][Status][Discuss]

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 < = 20,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的过程中求出,用gg[x][i]表示从第x个点开始到向上(1<<i)个点的路径中的最大值,注意预处理的时候gg[x][i]=max(gg[x][i-1],gg[ fa[x][i-1] ][i-1]); max中第二个gg里面第一维是fa[x][i-1]!!!一开始laj把搞成gg[x][i-1]了 _(:зゝ∠)_  不过可喜的是交上去的时候一遍过了ovo

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX1=15005;
 5 const int MAX2=30005;
 6 int n,m,K,f[MAX1];
 7 int tot,head[MAX1],adj[MAX2<<1],wei[MAX2<<1],next[MAX2<<1];
 8 int fa[MAX1][21],gg[MAX1][21],deep[MAX1];
 9 struct Edge{
10     int u,v,w;
11     bool operator < (const Edge &tt) const {
12         return w<tt.w;
13     }
14 }edge[MAX2];
15 inline int read(){
16     int an=0,x=1;char c=getchar();
17     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
18     while (c>='0' && c<='9') {an=(an<<3)+(an<<1)+c-'0';c=getchar();}
19     return an*x;
20 }
21 inline int getfather(int x){return f[x]==x?x:f[x]=getfather(f[x]);}
22 void addedge(int u,int v,int w){
23     tot++,adj[tot]=v,wei[tot]=w,next[tot]=head[u],head[u]=tot;
24 }
25 void dfs(int x,int ff){
26     int i,j;
27     for (i=1;i<=20;i++){
28         if (deep[x]<(1<<i)) break;
29         fa[x][i]=fa[ fa[x][i-1] ][i-1];
30         gg[x][i]=max(gg[x][i-1],gg[ fa[x][i-1] ][i-1]);
31     }
32     for (i=head[x];i;i=next[i]){
33         if (adj[i]!=ff){
34             deep[adj[i]]=deep[x]+1;
35             fa[adj[i]][0]=x;gg[adj[i]][0]=wei[i];
36             dfs(adj[i],x);
37         }
38     }
39 }
40 int lca(int x,int y){
41     int an=0,i,j;
42     if (deep[x]<deep[y]) swap(x,y);
43     int dd=deep[x]-deep[y];
44     for (i=20;i>=0;i--)
45         if (dd&(1<<i))
46             an=max(an,gg[x][i]),x=fa[x][i];
47     for (i=20;i>=0;i--){
48         if (fa[x][i]!=fa[y][i]){
49             an=max(an,max(gg[x][i],gg[y][i]));
50             x=fa[x][i],y=fa[y][i];
51         }
52     }
53     if (x!=y) an=max(an,max(gg[x][0],gg[y][0])),x=fa[x][0];
54     return an;
55 }
56 int main(){
57     freopen ("network.in","r",stdin);freopen ("network.out","w",stdout);
58     int i,j,u,v;tot=1;
59     n=read();m=read();K=read();
60     for (i=1;i<=m;i++) edge[i].u=read(),edge[i].v=read(),edge[i].w=read();
61     sort(edge+1,edge+m+1);
62     for (i=1;i<=n;i++) f[i]=i;
63     for (i=1;i<=m;i++){
64         int tx=getfather(edge[i].u);
65         int ty=getfather(edge[i].v);
66         if (tx!=ty){
67             f[tx]=ty;
68             addedge(edge[i].u,edge[i].v,edge[i].w);addedge(edge[i].v,edge[i].u,edge[i].w);
69         }
70     }
71     dfs(1,0);
72     for (i=1;i<=K;i++){
73         u=read(),v=read();
74         printf("%d\n",lca(u,v));
75     }
76     return 0;
77 }

 

转载于:https://www.cnblogs.com/keximeiruguo/p/7725655.html

相关文章:

  • 网络基础(持续更新)
  • Linux运维之道之admin1.1(命令行基础,目录和文件管理)
  • 《团队-科学计算器-模块开发过程》
  • 数据结构之栈
  • 课后作业:字串加密
  • 还没升级 iOS11?这个高危漏洞威胁近9成 iPhone 用户!
  • e租宝雇佣黑客攻击网贷之家 帮凶被判二年六个月
  • java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
  • 云计算大数据(Hadoop)开发工程师项目实战视频教程(九部分)
  • MySQL设置UTF8字符
  • Web大前端环境搭建
  • Java并发学习之ReentrantLock的工作原理及使用姿势
  • Jedis cluster集群初始化源码剖析
  • Locust no-web 模式与参数详解
  • 我所理解的Remoting (2) :远程对象的生命周期管理[下篇]
  • 【Leetcode】101. 对称二叉树
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker 笔记(2):Dockerfile
  • ES6核心特性
  • Hibernate最全面试题
  • java8 Stream Pipelines 浅析
  • js递归,无限分级树形折叠菜单
  • js如何打印object对象
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MySQL的数据类型
  • Quartz初级教程
  • React-redux的原理以及使用
  • Redis 中的布隆过滤器
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vue.js源码(2):初探List Rendering
  • 多线程 start 和 run 方法到底有什么区别?
  • - 概述 - 《设计模式(极简c++版)》
  • 工作中总结前端开发流程--vue项目
  • 微服务框架lagom
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (31)对象的克隆
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)大型网站架构演变和知识体系
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .describe() python_Python-Win32com-Excel
  • .gitignore文件—git忽略文件
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Micro Framework初体验(二)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net中的设计模式——Factory Method模式