BZOJ 3732: Network 最小生成树 倍增
3732: Network
题目连接:
http://www.lydsy.com/JudgeOnline/problem.php?id=3732
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
题意
题解:
求最小生成树之后,查询链上最大边的权值。
树链剖分或者倍增都可以。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=200500;
int n,m;
struct node
{
int x,y,c,no;
}E[N<<1];
int pre[N],to[N<<1],w[N<<1],nxt[N<<1],k;
int fa[N],lca[N][22],p[N][22],dep[N],cnt;
void makeedge(int x,int y,int c)
{
to[cnt]=x;w[cnt]=c;nxt[cnt]=pre[y];pre[y]=cnt++;
to[cnt]=y;w[cnt]=c;nxt[cnt]=pre[x];pre[x]=cnt++;
}
int getfather(int x)
{
if(fa[x]==x) return fa[x];else return fa[x]=getfather(fa[x]);
}
void dfs(int x)
{
for(int it=pre[x];~it;it=nxt[it])
{
int y=to[it],c=w[it];
if(y==lca[x][0]) continue;
dep[y]=dep[x]+1,lca[y][0]=x,p[y][0]=c;
dfs(y);
}
}
int query(int x,int y)
{
int ret=0;
if(dep[x]<dep[y]) swap(x,y);
for(int i=21;i>=0;i--)
if(dep[x]-(1<<i)>=dep[y])
ret=max(ret,p[x][i]),x=lca[x][i];
if(x==y) return ret;
for(int i=21;i>=0;i--)
if(lca[x][i]!=lca[y][i])
ret=max(ret,max(p[x][i],p[y][i])),x=lca[x][i],y=lca[y][i];
ret=max(ret,max(p[y][0],p[x][0]));
return ret;
}
bool cmp(node t1,node t2)
{
return t1.c<t2.c;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
memset(pre,-1,sizeof(pre));
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].c);
E[i].no=i;
}
sort(E+1,E+m+1,cmp);
long long tot=0;
for(int i=1;i<=m;i++)
{
int x=E[i].x,y=E[i].y;
int f1=getfather(x),f2=getfather(y);
if(f1!=f2)
{
fa[f2]=f1;
tot+=(long long)E[i].c;
makeedge(x,y,E[i].c);
}
}
dfs(1);
for(int j=1;j<=21;j++)
for(int i=1;i<=n;i++)
if(lca[i][j-1])
{
lca[i][j]=lca[lca[i][j-1]][j-1];
p[i][j]=max(p[i][j-1],p[lca[i][j-1]][j-1]);
}
for(int i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
}
BZOJ 3732: Network 最小生成树 倍增的更多相关文章
- 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(最短路+倍增 | LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...
- 【bzoj3732】Network 最小生成树+倍增LCA
题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...
- 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) ,第 ...
随机推荐
- tomcat 虚拟主机配置
1.虚拟主机 服务器接收到客户端请求时,会根据HTTP请求报文中的HOST头选择web站点进行响应.发送请求时,url中的主机名会被作为HTTP请求报文中的HOST发送给服务器.因此,可以根据不同的H ...
- 【原创】-- uboot,kennel,fs,rootfs 编译制作
环境:ubuntu14.04 内核版本 linux 3.13.0 OK6410 内核编译环境 linux 3.0.1 uboot版本 1.1.6 交叉编译工具链 arm-lin ...
- codeforces 429D
题意:给定一个数组你个数的数组a,定义sum(i, j)表示sigma(a[i],...a[j]),以及另外一个函数f(i, j) = (i - j)^2 + sum(i+1, j)^2 求最小的f( ...
- 解决VS2013+IE11调试DevExpress ASP.NET MVC的性能问题
将一个MVC项目从12.2升级到14.2,VS2012升到2013,发现使用IE11调试非常慢卡死,CPU占用100%,后来经过排除,发现只有DevExpress的MVC项目有这个问题. 最后在Dev ...
- Windows2003 架设VPN服务
一.确保Windows防火墙关闭. 在我的电脑上右键=>管理,在左边窗口找到“服务和应用程序”,展开,单击“服务”,在右边窗口中找到“Windows Firewall/Internet Conn ...
- 解析ASP.NET WebForm和Mvc开发的区别
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
- Nim教程【一】
这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...
- Java并行程序设计模式小结
这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...
- HTML Meta标签知多少
文章已同步至个人Blog:Benjamin - 专注前端开发和用户体验 一.基本属性 标签常常被用来定义HTML文档的元数据或者HTTP协议的指向,这些元数据常用在SEO.HTML Pages or ...
- Atitit.现实生活中最好使用的排序方法-----ati排序法总结
Atitit.现实生活中最好使用的排序方法-----ati排序法总结 1. 现在的问题 1 2. 排序的类别::插入排序//交换排序//选择排序(每次最小/大排在相应的位置 )//归并排序//基数排 ...