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求两点树上路径上的最大边权)的更多相关文章

  1. UVA 10048 Audiophobia 任意两点的路径上最大的边

    题目是要求任意给定两点的的路径上最大的边,最终输出这些最大边中最小的值,也就是求一条路径使得这条路径上最大的边在所有连通两点的路径中最短.根据Floyd—Warshall算法改造一下就行了.dp[i] ...

  2. CF 191C Fools and Roads lca 或者 树链剖分

    They say that Berland has exactly two problems, fools and roads. Besides, Berland has n cities, popu ...

  3. 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 ...

  4. [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 ...

  5. 【LCA求最近公共祖先+vector构图】Distance Queries

    Distance Queries 时间限制: 1 Sec  内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...

  6. CodeForces 459A Pashmak and Garden(水~几何-给两点求两点组成正方形)

    题目链接:http://codeforces.com/problemset/problem/459/A 题目大意: 给出两个点(在坐标轴中),求另外两个点从而构成一个正方形,该正方形与坐标轴平行. 如 ...

  7. poj 3728 The merchant 倍增lca求dp

    题目: zdf给出的题目翻译: 从前有一个富饶的国度,在这里人们可以进行自由的交易.这个国度形成一个n个点的无向图,每个点表示一个城市,并且有一个权值w[i],表示这个城市出售或收购这个权值的物品.又 ...

  8. 求两点之间距离 C++

    求两点之间距离(20 分) 定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数. 定义一个函数Distance(), 用于求两点之间的距离.输入格式: 输入有两行 ...

  9. UVALive - 7831 :ACM Tax (主席树求树路径上中位数:LCA+主席树)

    题意:给定一棵带权树,Q次询问,每次询问路径上的中位数. 思路:中位数分边数奇偶考虑,当当边数为num=奇时,结果就算路径第num/2+1大,用主席树做即可... (做了几道比较难的主席树,都wa了. ...

随机推荐

  1. 自动化测试--利用opencv进行图像识别与定位

    SIFT检测方法 SIFT算法就是把图像的特征检测出来,通过这些特征可以在众多的图片中找到相应的图片 import cv2 #读取图片,以1.png为例 img=cv2.imread('1.png') ...

  2. Linux中如何将系统调优

    Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级.Linux服务器有各 ...

  3. tomcat 端口8080占用问题

    启动tomcat时,有时会出现8080端口占用的问题. 解决方法: 终端:ps -e | grep tomcat 会看到下边的结果 途中标记的是进程号,kill掉即可. kill -9 9734(97 ...

  4. SCUT - 31 - 清一色 - dfs

    https://scut.online/p/31 还是不知道为什么RE了.的确非常玄学. 重构之后就没问题了.果然写的越复杂,分的情况越乱就越容易找不到bug. #include<bits/st ...

  5. git常用相关操作

    // 账号密码克隆远程项目 git clone http://账号:密码@项目地址 // 查看当前状态 git status // 查看修改内容 git diff // 添加并提交 git add . ...

  6. 2019-3-6-WPF-使用-SharpDX

    title author date CreateTime categories WPF 使用 SharpDX lindexi 2019-03-06 16:52:37 +0800 2018-4-20 9 ...

  7. Kintex 7五兄弟

    基KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡(136) 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一 ...

  8. 一、IIS性能检测与网站管理

    一.性能监视器 1.Windows Server自带的性能监视器.(开始 运行 perfmon ) 另一种方式打开 Performance Monitor 点击Windows+R,在Run中输入per ...

  9. [Tyvj2032]升降梯上(最短路)

    [Tyvj2032]升降梯上 Description 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升 ...

  10. VPS 安装MySQL

    目前Centos下默认支持的数据库是MariaDB,MariaDB是mysql的增强版本,由于mysql被Oracle收购之后,mysql之父担心之后mysql会变成闭源的软件,就又开发了这个版本,支 ...