uva11354 LCA+最小生成树+dp
源自大白书
题意 有n座城市通过m条双向道路相连,每条道路都有一个危险系数。你的任务是回答若干个询问,每个询问包含一个起点s和一个终点t,要求找到一条从s到t的路,使得途径所有的边的大最大危险系数最小。
解: 首先求出最小生成树,并把它改写成有根树,让fa[i]和cost[i]分别表示节点i的父亲编号和它与父亲之间的边权,L[i]表示节点i的深度,接下来通过预处理计算出数组anc 和 maxcost 其中anc[i][j] 表示节点i的2^j 级祖先的编号 macost[i][j] 表示i到2^j级 祖先之间的最大权值。
有了预处理 私用LCA 来查询结果, 查询p,q, 并且p比q深, 则可以先把p提升到和q处于同一级的位置,然后用二进制展开的方法不断把p和q同时往上提(保证二者深度相等),同时更新最大的边权
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
const int maxn = +;
const int INF =;
struct Edge{
int from,to, dist;
bool operator <(const Edge & rhs)const{
return dist<rhs.dist;
}
}E[maxn*];
struct ed{
int to,dist;
};
vector<ed> G[maxn];
int fa[maxn],per[maxn],cost[maxn],L[maxn];
int anc[maxn][],maxcost[maxn][];
void inti(int n){
for(int i =; i<n; i++){
per[i] = i;
G[i].clear();
}
}
void preprocess( int n){
for(int i=; i<n ; i++){
anc[i][] = fa[i]; maxcost[i][]=cost[i];
for(int j=; (<<j)<n; j++) anc[i][j]=-;
}
for(int j =; (<<j)<n; j++)
for(int i=; i<n; i++){
if(anc[i][j-]!=-){
int a = anc[i][j-];
anc[i][j]=anc[a][j-];
maxcost[i][j] = max(maxcost[i][j-],maxcost[a][j-]);
}
}
}
int fid(int u){
return per[u]==u?u:(per[u]= fid(per[u]));
}
void dfs(int u, int p,int dist, int depth){
fa[u]=p; cost[u] = dist; L[u] = depth;
for(int i = ; i<(int)G[u].size(); ++i){
ed e = G[u][i];
if(e.to == p) continue;
dfs(e.to,u,e.dist,depth+);
}
}
int query(int p, int q){
int log;
if(L[p]<L[q]) swap(p,q);
for( log =; (<<log)<=L[p]; log++); log--;
int ans=-INF;
for(int i = log ; i>=; i--)
if( L[p] - (<<i) >= L[q] ){
ans = max(ans,maxcost[p][i]);
p = anc[p][i];
}
if(p==q) return ans;
for(int i=log; i>=; i--)
if(anc[p][i]!=- && anc[p][i]!=anc[q][i]){
ans = max(ans,maxcost[p][i]); p = anc[p][i];
ans = max(ans,maxcost[q][i]); q = anc[q][i];
}
ans = max(ans,cost[p]);
ans = max(ans,cost[q]);
return ans;
}
int main()
{
int n,m,f=;
while(scanf("%d%d",&n,&m)==){
inti(n);
for(int i=; i<m ; i++){
int x,y,d;
scanf("%d%d%d",&x,&y,&d);
x--,y--;
E[i]=(Edge){x,y,d};
}
int lest = n;
sort(E,E+m);
for(int i=; i<m; i++){
int a = E[i].from,b=E[i].to, dist= E[i].dist;
int ca = fid(a),cb = fid(b);
if(ca!=cb){
per[ca] =cb;
lest--;
G[a].push_back((ed){b,dist} );
G[b].push_back((ed){a,dist} );
if(lest==) break;
}
}
dfs(,-,,);
preprocess(n);
int Q;
if(f)
puts("");
else f=;
scanf("%d",&Q);
for(int i =; i<Q; i++){
int s,t;
scanf("%d%d",&s,&t);
s--;t--;
printf("%d\n",query(s,t));
} } return ;
}
uva11354 LCA+最小生成树+dp的更多相关文章
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest
同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游 ...
- POJ3728 LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- POJ3417 LCA+树dp
http://poj.org/problem?id=3417 题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂 ...
- BZOJ3732Network——kruskal重构树+倍增+LCA/最小生成树+倍增
题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...
- LCA&最小生成树
LCA 经常被用来使用.比如询问树两点之间的距离. 比如树上差分 都是经常被使用的类型.有的时候倍增求LCA的同时还可以优化算法. 这道题呢 求一个严格的最小生成树,当然如果不严格的话如果有重边那么就 ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp
E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...
- POJ3728 THE MERCHANT LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- The Shortest Statement(Educational Codeforces Round 51 (Rated for Div.2)+最短路+LCA+最小生成树)
题目链接 传送门 题面 题意 给你一张有\(n\)个点\(m\)条边的联通图(其中\(m\leq n+20)\),\(q\)次查询,每次询问\(u\)与\(v\)之间的最短路. 思路 由于边数最多只比 ...
随机推荐
- [工具] TreeSizeFree 查看每个文件夹的大小
下载 URL :http://www.jam-software.com/treesize_free/ TreeSize Free这个软件可以非常简单方便的查看到每个文件夹的大小,而目录树的查看方式则让 ...
- 关于Jmeter3.0,你必须要知道的5点变化
2016.5.18日,Apache 发布了jmeter 3.0版本,本人第一时间上去查看并下载使用了,然后群里或同事都会问有什么样变化呢?正好在网上看到一遍关于3.0的文章,但是是英文的.这里翻译一下 ...
- 数字模型制作规范(转自Unity3D群)
本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸.单位,模型归类塌陷.命名.节点编辑, ...
- Unity3D笔记 愤怒的小鸟<七> 小鸟群准备动画
要实现的目标: 1.3只小鸟初始动画 2.完善代码slingShot.js 3.完善代码BirdMoving.js 1.实现3个准备动画:Unity3D内置的动画管理器 1.1.先选择GameObje ...
- mysql的启动脚本mysql.server及示例配置文件
以MySQL-server-4.0.14-0.i3862881064151.rpm为例,放在/data目录下 cd /data rpm -ivh MySQL-server-4.0.14-0.i386. ...
- 关于keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
Java加密的常用的加密算法类型有三种 1单向加密:也就是不可逆的加密,例如MD5,SHA,HMAC 2对称加密:也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等 3非对 ...
- CAP 一致性协议及应用解析
https://mp.weixin.qq.com/s/26x8O1bRzurl84e3nM6TTA CAP 一致性协议及应用解析 原创: 有赞技术 有赞coder 1周前 文 | 云开 on 用户中心 ...
- netcat/curl/wget/smb/icmp ping -p/dns/telnet
通过SMB协议,在目标服务器和主机之间建立网络共享连接,然后将目标服务器上的文件做分享,接着就可以在主机端将分享的文件copy下来啦.操作的命令如下, net use h: \\xxx.xxx.xxx ...
- mysql主从服务器的配置
使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3. ...
- mysql数据库的相关练习题及答案
表结构示意图: 表结构创建语句: class表创建语句 create table ) not null)engine=innodb default charset=utf8; student表创建语句 ...