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了. ...
随机推荐
- 20190902 On Java8 第十六章 代码校验
第十六章 代码校验 你永远不能保证你的代码是正确的,你只能证明它是错的. 测试 测试覆盖率的幻觉 测试覆盖率,同样也称为代码覆盖率,度量代码的测试百分比.百分比越高,测试的覆盖率越大. 当分析一个未知 ...
- SQL server 2008r2 file is corrupt
下载的SQLManagement studio有问题,重新下载一遍后再安装就好了.安装顺序没问题. 在卸载SQL Server开始——运行:输入regedit 进入注册表编辑器,进入之后执行下列操作: ...
- WPF使用Mutex创建单实例程序失效
vs2019 1.引入名称空间 using System.Threading; using System.Runtime.InteropServices; 2.导入dll并声明方法 [DllImpor ...
- [Vim] 03 凡人进阶
目录 0. 前言 1. 按下 Esc, 进入编辑模式 (1) 定位 (2) 删除 1) 不进入插入模式的删除 2) 进入插入模式的删除 3. 10 个特殊字符 4. 在 gVim 下执行命令 (1) ...
- [2019南京网络赛D题]Robots
题目链接 2019.9.2更新 第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ #include<bits/stdc++.h> using namespac ...
- [2019杭电多校第五场][hdu6625]three arrays(01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6625 大意为给你两个数组a和b,对应位置异或得到c数组,现在可以将a,b数组从新排序求c数组,使得字典 ...
- Codeforces 475D 题解(二分查找+ST表)
题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q ...
- docker pull使用 代理
[root@fdfs- ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Con ...
- 防止 iframe 的链接重定向父级页面
项目中发现,多系统通过iframe嵌套时,如果iframe的请求是重定向会导致父级页面重定向,怎么破? 查找MDN(https://developer.mozilla.org/zh-CN/docs), ...
- apache2.4 只允许合法域名访问网站 禁止使用ip、非法域名访问
1.ip访问禁用ip访问 只能对应端口有效<VirtualHost *:80> ServerName xx.xx.xx.xx ServerAlias * <Location /> ...