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+3;
vector<pair<int,int> >G[maxn];
int pre[maxn],fa[maxn][19],dep[maxn],mx[maxn][19],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=0 ; i<G[u].size() ; i++){int v=G[u][i].first;if(p==v) continue;dep[v]=dep[u]+1;fa[v][0]=u;mx[v][0]=G[u][i].second;dfs(v,u);}
}
int lca(int u , int v)
{if(dep[u]>dep[v]) swap(u,v);for(int i=0 ; i<18 ; i++)if((dep[v]-dep[u])&(1<<i)) v=fa[v][i];if(u==v) return u;for(int i=17 ; i>=0 ; i--)if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];return fa[u][0];
}
int ask(int u , int st)
{int ret=0;for(int i=0 ; i<18 ; i++)if(st&(1<<i)) ret=max(ret,mx[u][i]),u=fa[u][i];return ret;
}
int main()
{scanf("%d%d",&n,&m);for(int i=0 ; i<m ; i++){a[i].id=i;scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);}///卡鲁思for(int i=1 ; i<=n ; i++) pre[i]=i;sort(a,a+m,cmp);for(int i=0 ; i<m ; i++){int u=ffind(a[i].u) , v=ffind(a[i].v);if(u!=v){pre[u]=v;ans[a[i].id]=-1;G[a[i].u].push_back({a[i].v,a[i].w});G[a[i].v].push_back({a[i].u,a[i].w});}}///lcadep[1]=1; dfs(1,0);for(int i=1 ; i<18 ; i++)for(int j=1 ; j<=n ; j++){fa[j][i]=fa[fa[j][i-1]][i-1];mx[j][i]=max(mx[j][i-1],mx[fa[j][i-1]][i-1]);}for(int i=0 ; i<m ; i++)if(ans[a[i].id]!=-1){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=0 ; i<m ; i++){if(ans[i]!=-1)printf("%d ",ans[i]);}
}

View Code

转载于:https://www.cnblogs.com/shuaihui520/p/11150481.html

CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)相关推荐

  1. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定n个点和m条边,要求最多选择n条边,使得1到n连通,然后每段路同时开工,求最小工时.换句话说,求的是连通路上最大边权最小. ...

  2. 求一个指定点对的路径上的最大边权或最小边权(转)

    dij贪心地取min(cur,pre)最大的路径 或者直接按权值排序,贪心地从最小或最大取,并茶几加点,联通停止即可... 我们还可以用二分..就是二分最大边权或者最小边权..重复上面类似kruska ...

  3. c++求两点的距离利用友元_用c++定义两个坐标点,计算两点间距离;进而计算线段的面积...

    //本程序有三个层次 //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance ...

  4. matlab求点,MATLAB求两点中点

    已知两点坐标,连接这两点,求线段的中点坐标.有没有什么公式啊? A(x1,y1).B(x2,y2),则AB中点是M((x1+x2)/2,(y1+y2)/2) 如何用MATLAB做出一个求两点间最短距离 ...

  5. 7-1 求两点之间距离

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

  6. PTA 求两点之间距离 (20 分)

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

  7. C语言 求两点之间线段距离

    求两点之间线段位置 函数求距离方法 #include <stdio.h> #include<math.h> double square(); int main() {print ...

  8. JAVA求两点间的距离:

    求两点间的距离 给定 A(x1, y1),B(x2​,y2​) 两点坐标,计算它们间的距离. 输入格式 输入包含四个实数x1​,y1​,x2​,y2​,分别用空格隔开,含义如描述. 输出格式 输出占一 ...

  9. C++第一次实验-求两点之间的距离

    一.问题及代码 /* 文件名称:Test4.cpp * 作 者:胡嘉威 * 完成日期: 2017 年 2 月 28 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:输入两个点的坐标,求两 ...

最新文章

  1. 拉格朗日乘数法的原理,我用10幅图把它讲清楚了
  2. 【7.9 讲座直播】纳米孔靶向测序技术在新型冠状病毒与常见呼吸道病毒快速诊断中的应用...
  3. R | 对亚马逊新总部可能位置进行可视化
  4. Java并发之同步的产生及解决
  5. optee3.14.0 qemu_v8的环境搭建篇
  6. 一款标注颜色,距离的小软件 markman
  7. 开机后能解锁吗_黔隆科技刷机教程360奇酷Q5PLUS(1509A00)忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  8. android学习笔记九——RatingBar
  9. #1419 : 后缀数组四·重复旋律4 (重复次数最多的连续字串)
  10. 面向对象知识点之statickeyword的使用
  11. gradle 命令行_Gradle命令行便利
  12. c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...
  13. Servlet方法详解
  14. SpringCloud工作笔记082---自动化部署Jenkins_Windows下安装使用Jekins
  15. 取余运算怎么算_3 数学运算 矩阵操作
  16. Unix Windows
  17. 将中文姓名转为拼音英文名的一种实现
  18. 知名IB学校ib英文书单合集
  19. JS如何实现百度地图
  20. 本周最新文献速递20211226

热门文章

  1. 设计模式 - 建造者模式(Builder Pattern)
  2. reactjs组件通信方式总结
  3. 【网址收藏】Hadoop3.2.1 【 YARN 】源码分析 : ResourceLocalizationService解析
  4. kafka topic常用命令
  5. Java基础--通过反射获取成员方法并使用
  6. Mybatis的@Param注解作用
  7. mysql配置向导文件_Mysql的安全配置向导命令mysql_secure_installation
  8. 多服务监听Redis key失效通知,并指定特定机器进行处理业务
  9. QML和C ++之间的数据类型转换---枚举
  10. Qt for Android获取手机序列号/手机型号/手机制造商