BZOJ-3732 Network 图论 最小生成树 倍增
题意:给你N个点,M条边的无向图 (N<=15000,M<=30000)第j条边的长度为 dj (1<=dj<=1e9),然后K个询问 (1<=K<=20000)。
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
题解:求所有路径上,那些最大的边中最小的值,也就是“最小”的路径上的最大值,那也是就是最小生成树上,路径的最大值,多次询问,利用树链剖分或者倍增解决
- #include<bits/stdc++.h>
- using namespace std;
- #define lld long long
- #define N 30005
- struct rec
- {
- int go,next,v;
- }eg[N],a[N];
- int k,m,n,x,y,p,head[N],lca[N][],q[N][],dep[N];
- int fa[N];
- void build(int x,int y,int c)
- {
- p++;
- eg[p].next=head[x];
- eg[p].go=y;
- eg[p].v=c;
- head[x]=p;
- }
- bool cmp(rec x,rec y)
- {
- return x.v<y.v;
- }
- int get(int x)
- {
- if (fa[x]==x) return x;
- fa[x]=get(fa[x]);
- return fa[x];
- }
- int query(int x,int y)
- {
- int ret=;
- if (dep[x]<dep[y]) swap(x,y);
- for (int i=;i>=;i--)
- if (dep[x]-(<<i)>=dep[y])
- {
- ret=max(ret,q[x][i]);
- x=lca[x][i];
- }
- if (x==y) return ret;
- for (int i=;i>=;i--)
- if (lca[x][i]!=lca[y][i])
- {
- ret=max(ret,max(q[x][i],q[y][i]));
- x=lca[x][i];
- y=lca[y][i];
- }
- ret=max(ret,max(q[x][],q[y][]));
- return ret;
- }
- void dfs(int x)
- {
- for (int i=head[x];i;i=eg[i].next)
- {
- int v=eg[i].go;
- if (v==lca[x][]) continue;
- dep[v]=dep[x]+;
- lca[v][]=x;
- q[v][]=eg[i].v;
- dfs(v);
- }
- }
- int main()
- {
- freopen("1.txt","r",stdin);
- scanf("%d%d%d",&n,&m,&k);
- for (int i=;i<=n;i++) fa[i]=i;
- for (int i=;i<=m;i++) scanf("%d%d%d",&a[i].go,&a[i].next,&a[i].v);
- sort(a+,a+m+,cmp);
- int cnt=;
- for (int i=;i<=m;i++)
- {
- x=get(a[i].go),y=get(a[i].next);
- if (x!=y)
- {
- fa[x]=y;
- cnt++;
- build(a[i].go,a[i].next,a[i].v);
- build(a[i].next,a[i].go,a[i].v);
- }
- if (cnt==n-) break;
- }
- dfs();
- for (int j=;j<=;j++)
- for (int i=;i<=n;i++)
- if (lca[i][j-])
- {
- lca[i][j]=lca[lca[i][j-]][j-];
- q[i][j]=max(q[i][j-],q[lca[i][j-]][j-]);
- }
- while (k--)
- {
- scanf("%d%d",&x,&y);
- printf("%d\n",query(x,y));
- }
- }
BZOJ-3732 Network 图论 最小生成树 倍增的更多相关文章
- BZOJ 3732: Network 最小生成树 倍增
3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...
- bzoj 3732 Network(最短路+倍增 | LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...
- BZOJ 3732 Network Kruskal+倍增LCA
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...
- BZOJ 3732 Network
2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...
- bzoj 3732: Network 树上两点边权最值
http://www.lydsy.com/JudgeOnline/problem.php?id=3732 首先想到,要使得最长边最短,应该尽量走最短的边,在MST上. 然后像LCA那样倍增娶个最大值 ...
- bzoj 3732: Network【克鲁斯卡尔+树链剖分】
先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 #include<iostream> #include<cstdio&g ...
- BZOJ 3732 Network 【模板】kruskal重构树
[题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...
- [bzoj 3732] Network (Kruskal重构树)
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...
随机推荐
- js点击事件 注册下一步实现代码
点击事件: <body> <input type="button" id="btn1"/> <input type="b ...
- 折纸---珠穆朗玛问题----简单for 循环
一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? package com.zuoye.test; public class Zhezhi { public s ...
- dubbo之回声测试
回声测试 回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控. 所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoSe ...
- AI不与人为敌
业界广为流传着一句话:有多少人工就有多少智能. 其实还应该有一句话:有多少付出就因该有多少回报.公正是世界永恒的话题. 一.人工智能还是人工愚蠢 科技从来没有善恶,也不会杀人,愚蠢的人比聪明的人做的错 ...
- C# ref 和 out 的使用
private void button1_Click(object sender, EventArgs e) { ; ; Fun(ref a,ref b); //把a的地址和b的地址 传递过去 Mes ...
- Linux 之根目录介绍
1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...
- 使用.Net Core RT 标准动态库
这个文档可以引导你如何通过CoreRT生成一个原生标准的系统动态库让其他编程语言调用. CoreRT 可以构建静态库, 这些库可以在编译时链接或者也可以构建运行时所需的共享库, 创建一个支持CoreR ...
- LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 LCT+SAM+线段树
Code: #include<bits/stdc++.h> #define maxn 200003 using namespace std; void setIO(string s) { ...
- [接口管理平台] eoLinker AMS 专业版 V3.5 :加入数据结构管理、通用函数管理、API 快速测试等近 30 项更新
eoLinker AMS是集API文档管理.API自动化测试.开发协作三位一体的综合API开发管理平台,是中国最大的在线API管理平台.目前eoLinker AMS已经为来自全球的超过两万家企业托管超 ...
- Python语言简介
一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号“龟叔”,圣诞节期间开始编写Python语言的编译器. Python这个名字,来自Guido所挚爱的电视 ...