CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)
http://codeforces.com/contest/1184/problem/E2
题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求一边生成树的时候可以包含被修改的边(注意:修改的边权要最大 )题目规定只有一课生成树
分析:
现在我们需要解决所有非树边的任务(MST保证是惟一的)。我们要求对于非树边(u, v),正确答案是u和v之间路径上的最大权值MST。(证明:≤:由MSTs的循环特性可知;≥:如果(u, v)的重量大于这个最大值,然后用(u, v)交换获得最大值的边,会得到一个更便宜的树a矛盾。
所以现在我们的任务就是求任意两点在生成树上的路径最大边权。这题我们可以用LCA的思想去完成,我们现在预处理出了一条路上走过的最大值,那么答案所求mx=max(mx(u->w) , mx(v->w)) ;w为u,v的最近公共祖先,这里采用倍增法的思想去完成
#include<bits/stdc++.h>
using namespace std ;
int n,m;
const int maxn = 1e6+;
vector<pair<int,int> >G[maxn];
int pre[maxn],fa[maxn][],dep[maxn],mx[maxn][],ans[maxn];
struct no
{
int id,u,v,w;
}a[maxn];
bool cmp(no a , no b)
{
return a.w<b.w;
}
int ffind(int x)
{
if(pre[x]==x) return x;
pre[x]=ffind(pre[x]);
return pre[x];
}
void dfs(int u , int p)
{
for(int i= ; i<G[u].size() ; i++)
{
int v=G[u][i].first;
if(p==v) continue;
dep[v]=dep[u]+;
fa[v][]=u;
mx[v][]=G[u][i].second;
dfs(v,u);
}
}
int lca(int u , int v)
{
if(dep[u]>dep[v]) swap(u,v);
for(int i= ; i< ; i++)
if((dep[v]-dep[u])&(<<i)) v=fa[v][i];
if(u==v) return u;
for(int i= ; i>= ; i--)
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][];
}
int ask(int u , int st)
{
int ret=;
for(int i= ; i< ; i++)
if(st&(<<i)) ret=max(ret,mx[u][i]),u=fa[u][i];
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i= ; i<m ; i++)
{
a[i].id=i;
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
///卡鲁思
for(int i= ; i<=n ; i++) pre[i]=i;
sort(a,a+m,cmp);
for(int i= ; i<m ; i++)
{
int u=ffind(a[i].u) , v=ffind(a[i].v);
if(u!=v)
{
pre[u]=v;
ans[a[i].id]=-;
G[a[i].u].push_back({a[i].v,a[i].w});
G[a[i].v].push_back({a[i].u,a[i].w});
}
}
///lca
dep[]=; dfs(,);
for(int i= ; i< ; i++)
for(int j= ; j<=n ; j++)
{
fa[j][i]=fa[fa[j][i-]][i-];
mx[j][i]=max(mx[j][i-],mx[fa[j][i-]][i-]);
}
for(int i= ; i<m ; i++)
if(ans[a[i].id]!=-)
{
int u=a[i].u ,v=a[i].v , w=lca(u,v);
ans[a[i].id]=max(ask(u,dep[u]-dep[w]),ask(v,dep[v]-dep[w]));
}
for(int i= ; i<m ; i++)
{
if(ans[i]!=-)
printf("%d ",ans[i]);
}
}
CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)的更多相关文章
- UVA 10048 Audiophobia 任意两点的路径上最大的边
题目是要求任意给定两点的的路径上最大的边,最终输出这些最大边中最小的值,也就是求一条路径使得这条路径上最大的边在所有连通两点的路径中最短.根据Floyd—Warshall算法改造一下就行了.dp[i] ...
- CF 191C Fools and Roads lca 或者 树链剖分
They say that Berland has exactly two problems, fools and roads. Besides, Berland has n cities, popu ...
- Codeforces Round #620 (Div. 2)E(LCA求树上两点最短距离)
LCA求树上两点最短距离,如果a,b之间距离小于等于k并且奇偶性与k相同显然YES:或者可以从a先走到x再走到y再走到b,并且a,x之间距离加b,y之间距离+1小于等于k并且奇偶性与k相同也输出YES ...
- [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...
- 【LCA求最近公共祖先+vector构图】Distance Queries
Distance Queries 时间限制: 1 Sec 内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...
- CodeForces 459A Pashmak and Garden(水~几何-给两点求两点组成正方形)
题目链接:http://codeforces.com/problemset/problem/459/A 题目大意: 给出两个点(在坐标轴中),求另外两个点从而构成一个正方形,该正方形与坐标轴平行. 如 ...
- poj 3728 The merchant 倍增lca求dp
题目: zdf给出的题目翻译: 从前有一个富饶的国度,在这里人们可以进行自由的交易.这个国度形成一个n个点的无向图,每个点表示一个城市,并且有一个权值w[i],表示这个城市出售或收购这个权值的物品.又 ...
- 求两点之间距离 C++
求两点之间距离(20 分) 定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数. 定义一个函数Distance(), 用于求两点之间的距离.输入格式: 输入有两行 ...
- UVALive - 7831 :ACM Tax (主席树求树路径上中位数:LCA+主席树)
题意:给定一棵带权树,Q次询问,每次询问路径上的中位数. 思路:中位数分边数奇偶考虑,当当边数为num=奇时,结果就算路径第num/2+1大,用主席树做即可... (做了几道比较难的主席树,都wa了. ...
随机推荐
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- python函数-作用域
可以把作用域”看成是变量的容器.当作用域被销毁时,所有保存在该作用 域内的变量的值就被丢弃了,只有一个全局作用域,它是在程序开始时创建的.如 果程序终止,全局作用域就被销毁,它的所有变量就被丢弃了. ...
- How to increase timeout for your ASP.NET Application ?
How to increase timeout for your ASP.NET Application ? 原文链接:https://www.techcartnow.com/increase-tim ...
- 通过挂载系统U盘搭建本地yum仓库
首先打开hbza(CentOS)和yum,两者要连接上 第1步:在hbza中创建一个目录 输入mkdir /lxk,名字随便起.输入mount /dev/cdrom /lxk 第2步:打开yum, ...
- mysql忘记密码/修改密码
关键词:忘记密码,修改密码,mysql忘记密码,mysql修改密码 转自:https://www.cnblogs.com/jdxn/p/6847089.html 方法1: 用SET PASSWORD命 ...
- 优化内存_内存泄漏——C
内存泄漏: 动态申请内存,没有正常释放,后续又申请内存,也没释放内存,导致内存池被全部被占用,最终再申请内存的时候失败:严格点则每次申请内存的时候判断申请到的指针是否为空,若为空NULL则表示申请失 ...
- 【CF321E】+【bzoj5311】
决策单调性 + WQS二分 贴个代码先... //by Judge #pragma GCC optimize("Ofast") #include<bits/stdc++.h& ...
- 【推荐系统】知乎live入门5.常用技能与日常工作
参考链接 [推荐系统]知乎live入门 目录 1. 实习与求职 2. 推荐算法职责 3. 解构算法 4. 参考资料 5. 其他强关联岗位 6. 工作模型和日常工作 7. 2017年相关论文 8. 找工 ...
- 获取Http请求IP的工具类
public class IpAddressUtil { public static String getIpAddr(HttpServletRequest request){ String ipAd ...
- ASE Backend Alpha Sprint Review
[Backend] Alpha Review展示博客 团队成员介绍:仅限于Alpha阶段有贡献的成员. 典型场景描述:描述并说明你们认为的产品面向的典型场景. 团队管理与协作:包括但不限于团队内部如何 ...