bzoj3732: Network--kruskal最小生成树+LCA
这是一道写起来比较顺手的题目
没有各种奇怪的细节,基本就是Kruskal和倍增LCA的模板。。
题目大意:对于一个无向带权图,询问两点之间一条路,使得这条路上的最长边最小,输出最小最长边的的值
那么既然要使最长边最短,我们可以先构造一棵最小生成树
由于kruskal已经将边排了序了,所以对于这棵树,每条边都尽量最短了
然后我们再进行lca求出两点路径上的最长边,即为答案
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ; struct node{ int u,v,cost,next; }e[maxn*],et[maxn*]; int head[maxn],n,m,K,tot,logn,u,v; ],mx[maxn][]; void insert(int u, int v, int c){ e[++tot].u=u; e[tot].v=v; e[tot].cost=c; e[tot].next=head[u]; head[u]=tot; } bool cmp(node a, node b){ return a.cost<b.cost; } int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } void MST(){ ; i<=n; i++) f[i]=i; ; i<=m; i++){ int fx=find(et[i].u), fy=find(et[i].v); if (fx!=fy){ f[fy]=fx; insert(et[i].u,et[i].v,et[i].cost); insert(et[i].v,et[i].u,et[i].cost); } } } void dfs(int u, int f, int d, int cost){ dep[u]=d; fa[u][]=f; mx[u][]=cost; ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-]; ; i<=logn; i++) mx[u][i]=max(mx[u][i-],mx[fa[u][i-]][i-]); ; i=e[i].next) ,e[i].cost); } int lca_max(int u, int v){ ; if (dep[u]>dep[v]) swap(u,v); while (dep[u]<dep[v]){ ; i--) if (dep[u]<dep[fa[v][i]]){ ans=max(ans,mx[v][i]); v=fa[v][i]; } ans=max(ans,mx[v][]); v=fa[v][]; } if (u==v) return ans; ; i--){ if (fa[u][i]!=fa[v][i]){ ans=max(ans,max(mx[v][i],mx[u][i])); u=fa[u][i]; v=fa[v][i]; } } ans=max(ans,max(mx[u][],mx[v][])); return ans; } int main(){ scanf("%d%d%d", &n, &m, &K); tot=-; memset(head,-,sizeof(head)); <<logn)<n) logn++; ; i<=m; i++) scanf("%d%d%d", &et[i].u, &et[i].v, &et[i].cost); sort(et+,et++m,cmp); MST(); dfs(,,,); while (K--){ scanf("%d%d", &u, &v); printf("%d\n", lca_max(u,v)); } ; }
bzoj3732: Network--kruskal最小生成树+LCA的更多相关文章
- 【BZOJ3732】 Network Kruskal+倍增lca
Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_ ...
- BZOJ3732: Network(Kruskal重构树)
题意 Link 给出一张$n$个点的无向图,每次询问两点之间边权最大值最小的路径 $n \leqslant 15000, m \leqslant 30000, k \leqslant 20000$ S ...
- BZOJ 3732 Network Kruskal+倍增LCA
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...
- BZOJ-3732 Network 图论 最小生成树 倍增
题面 题意:给你N个点,M条边的无向图 (N<=15000,M<=30000)第j条边的长度为 dj (1<=dj<=1e9),然后K个询问 (1<=K<=2000 ...
- Kruskal 最小生成树算法
对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...
- 贪心算法(2)-Kruskal最小生成树
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...
- Prim和Kruskal最小生成树
标题: Prim和Kruskal最小生成树时 限: 2000 ms内存限制: 15000 K总时限: 3000 ms描述: 给出一个矩阵,要求以矩阵方式单步输出生成过程.要求先输出Prim生成过程,再 ...
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- bzoj3732: Network(最小生成树+LCA)
3732: Network 题目:传送门 题解: 第一眼就看到最大边最小,直接一波最小生成树. 一开始还担心会错,问了一波肉大佬,任意两点在最小生成树上的路径最大边一定是最小的. 那么事情就变得简单起 ...
随机推荐
- matlab报错
这可能说明..压根就没有这个函数
- kylin的安装与配置
我的环境: Cloudera Hadoop5.3.6 其中, Hadoop版本2.5.0 Hbase版本0.98.6 Hive版本0.13.1 使用的kylin版本:1.5.2.1 下载地址: htt ...
- 廖雪峰教程笔记:js中map和reduce的用法
举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组[1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map实现如下: 由于map()方法定义在JavaScript的 ...
- css3 总结01
前缀 chrome: -webkit- safari: -webkit- firefox: -moz- ie: -ms- opera: -o- 书写的时候应该先用有前缀的样式,再用无前缀的样式 颜色 ...
- git 基础使用
1: 安装客户端 2: 注册使用github 3: 具体操作 3-1: 右键打开:git bash here 执行 ssh-keygen -t rsa -C "youremail@examp ...
- set UVA 11136 Hoax or what
题目传送门 题意:训练指南P245 分析:set维护,查询删除最大最小值 #include <bits/stdc++.h> using namespace std; typedef lon ...
- JavaScript实现li隔行变色
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Codeforces 581F Zublicanes and Mumocrates(树形DP)
题目大概说有一棵树要给结点染色0或1,要求所有度为1的结点一半是0一半是1,然后问怎么染色,使两端点颜色不一样的边最少. dp[0/1][u][x]表示以u结点为根的子树中u结点是0/1色 且其子树有 ...
- ural 2063. Black and White
2063. Black and White Time limit: 1.0 secondMemory limit: 64 MB Let’s play a game. You are given a r ...
- ccc 正态分布
cc.Class({ extends: cc.Component, properties: { prefab: { default:null, type:cc.Prefab }, root: { de ...