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 最小生成树 倍增的更多相关文章

  1. BZOJ 3732 Network —— 最小生成树 + 倍增LCA

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...

  2. BZOJ 3732 Network Kruskal+倍增LCA

    题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...

  3. bzoj 3732 Network(最短路+倍增 | LCT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3732 [题意] 给定一个无向图,处理若干询问:uv路径上最长的边最小是多少? [思路一 ...

  4. 【bzoj3732】Network 最小生成树+倍增LCA

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  5. BZOJ 3732 Network

    2016.1.28 纪念我BZOJ第一题 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= ...

  6. bzoj 3732: Network 树上两点边权最值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3732 首先想到,要使得最长边最短,应该尽量走最短的边,在MST上. 然后像LCA那样倍增娶个最大值 ...

  7. bzoj 3732: Network【克鲁斯卡尔+树链剖分】

    先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 #include<iostream> #include<cstdio&g ...

  8. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

  9. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

随机推荐

  1. 【转】jquery validate验证框架与kindeditor使用需二次提交的问题

    原文:http://blog.csdn.net/wlsyn/article/details/11536399在使用jquery的验证框架对kindeditor富文本编辑器进行验证的过程中,发现提 交时 ...

  2. C# 基本算法

    1.冒泡排序 排序 ,,,,,, }; ; i < ArrayList.Count(); i++) { for (int j = i; j < ArrayList.Count(); j++ ...

  3. Linux搭建SVN服务器(centos)

    http://wenku.baidu.com/link?url=0SnbE5pQG8K-RKnPlKcdesMWxS5YC64glkk5sCyxHorR37nX-qa4w0ViWLp55oDnRpTn ...

  4. centos下安装iftop

    CentOS 下iftop 的安装 安装方法一:编译安装(安装成功) wget http://ex-parrot.com/~pdw/iftop/download/iftop-0.17pre3.tar. ...

  5. ubuntu搭建svn服务器(转)

    在阿里云买了个服务器,想上传东西,samba不好用,想起来可以搭个svn用,找到了这篇. 1. 安装SVN apt-get install subversion 2. 建立svn仓库 1). 建立sv ...

  6. C++堆栈生长方向

    栈区:临时区 #include <iostream> using namespace std; #include <stdio.h> int main() { ; ; cout ...

  7. 【leetcode】Linked List Cycle

    这个题真是坑死了,只怪自己不好吧.一开始审题,以为是给定一个首尾相连的链表,查看其中是否有循环(原谅我的无知吧!!).然后在那写啊写啊写,还在纠结是局部循环还是前一半和后一半一样这样的循环,blah ...

  8. SQLSERVER 数据库性能的的基本

    SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...

  9. 安装SQLSERVER2012遇到的一些问题

    安装SQLSERVER2012遇到的一些问题 先到MSDN我告诉你http://msdn.itellyou.cn/下载安装包,我每次都到MSDN我告诉你里下载的,因为那里的安装包保证能用 我的环境是: ...

  10. 编译nginx时提示undefined reference to 'pcre_free_study' 的问题及解决

    ./configure --add-module=../ngx_devel_kit-0.2.19/ --add-module=../lua-nginx-module-0.9.19/  --with-l ...