先用kruskal处理出一个最小生成树

对于非树边,倍增找出两端点间的最大边权-1就是答案

对于树边,如果它能被替代,就要有一条非树边,两端点在树上的路径覆盖了这条树边,而且边权不大于这条树边

这里可以树剖来做,但是不想用..

如果先把非树边从小到大排序然后去覆盖树边,那么一条树边只需要被覆盖一次

所以可以用一个并查集来把父子边被覆盖的点合到一起,在合并之前记下来这次覆盖的边权,下次再覆盖的时候直接跳过去就可以

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+,inf=1e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b,l,ne;
bool used;
}eg[maxn],eg2[maxn*];
int egh[maxn],ect;
int N,M,fa[maxn][],bf[maxn],bm[maxn],ma[maxn][],dep[maxn];
int ans[maxn]; inline int getf(int x){return bf[x]==x?x:bf[x]=getf(bf[x]);}
inline bool cmp(Edge a,Edge b){return a.l<b.l;}
inline void adeg(int a,int b,int c){
eg2[++ect].b=b;eg2[ect].ne=egh[a];
eg2[ect].l=c,egh[a]=ect;
} void dfs(int x){
// printf("!!%d %d %d\n",x,fa[x][0],ma[x][0]);
for(int i=;fa[x][i]&&fa[fa[x][i]];i++)
fa[x][i+]=fa[fa[x][i]][i],ma[x][i+]=max(ma[x][i],ma[fa[x][i]][i]);
for(int i=egh[x];i;i=eg2[i].ne){
int b=eg2[i].b;
if(b==fa[x][]) continue;
ma[b][]=eg2[i].l;
fa[b][]=x;dep[b]=dep[x]+;
dfs(b);
}
} int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int re=;
for(int i=log2(dep[x]-dep[y]);i>=&&dep[x]!=dep[y];i--){
if(fa[x][i]&&dep[fa[x][i]]>=dep[y])
re=max(re,ma[x][i]),x=fa[x][i];
}
if(x==y) return re;
for(int i=log2(dep[x]);i>=;i--){
if(fa[x][i]!=fa[y][i])
re=max(re,max(ma[x][i],ma[y][i])),x=fa[x][i],y=fa[y][i];
}
return max(re,max(ma[x][],ma[y][]));
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
eg[i].a=rd(),eg[i].b=rd(),eg[i].l=rd();
eg[i].ne=i;
}
sort(eg+,eg+M+,cmp);
for(i=;i<=N;i++) bf[i]=i;
for(i=,j=;i<=M&&j<N-;i++){
int a=getf(eg[i].a),b=getf(eg[i].b);
if(a!=b){
bf[a]=b;
adeg(eg[i].a,eg[i].b,eg[i].l);
adeg(eg[i].b,eg[i].a,eg[i].l);
eg[i].l=inf;eg[i].used=;
j++;
}
}
dep[]=;dfs();
sort(eg+,eg+M+,cmp);
for(i=;i<=N;i++) bf[i]=i,bm[i]=inf;
for(i=;i<=M;i++){
if(eg[i].used) continue;
int a=getf(eg[i].a),b=getf(eg[i].b);
while(a!=b){
if(dep[a]<dep[b]) swap(a,b);
int bb=getf(fa[a][]);
bf[a]=bb,bm[a]=eg[i].l;
a=bb;
}
}
for(i=;i<=M;i++){
if(eg[i].used){
int a=eg[i].a,b=eg[i].b;
if(dep[a]<dep[b]) swap(a,b);
// a=getf(a),b=getf(b);
if(bm[a]<inf) ans[eg[i].ne]=bm[a]-;
else ans[eg[i].ne]=-;
}else{
ans[eg[i].ne]=lca(eg[i].a,eg[i].b)-;
}
}
for(i=;i<=M;i++)
printf("%d ",ans[i]);
return ;
}

cf827D Best Edge Weight (kruskal+倍增lca+并查集)的更多相关文章

  1. 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集

    [题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...

  2. 【BZOJ-3910】火车 倍增LCA + 并查集

    3910: 火车 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 262  Solved: 90[Submit][Status][Discuss] De ...

  3. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  4. BZOJ 4144 Dijkstra+Kruskal+倍增LCA

    思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...

  5. BZOJ 3732 Network Kruskal+倍增LCA

    题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...

  6. CF827D Best Edge Weight 题解

    题意: 给定一个点数为 n,边数为 m,权值不超过 \(10^9\) 的带权连通图,没有自环与重边. 现在要求对于每一条边求出,这条边的边权最大为多少时,它还能出现在所有可能的最小生成树上,如果对于任 ...

  7. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  8. [学习笔记]kruskal重构树 && 并查集重构树

    Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...

  9. CF1253F Cheap Robot(神奇思路,图论,最短路,最小生成树/Kruskal 重构树/并查集)

    神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全 ...

随机推荐

  1. [Spark][python]以DataFrame方式打开Json文件的例子

    [Spark][python]以DataFrame方式打开Json文件的例子: [training@localhost ~]$ cat people.json{"name":&qu ...

  2. Codeforces 987E Petr and Permutations(数组的置换与复原 、结论)

    题目连接: Petr and Permutations 题意:给出一个1到n的序列,Petr打乱了3n次,Um_nik打乱了7n+1次,现在给出被打乱后的序列,求是谁打乱的. 题解:因为给出了一个3* ...

  3. Flutter - AAPT: error: resource android:attr/dialogCornerRadius not found.

    Launching lib\main.dart on Nokia X6 in debug mode... FAILURE: Build failed with an exception. * What ...

  4. Webpack 2 视频教程 002 - NodeJS 安装与配置

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  5. Ubuntu16.04下使用rdesktop命令远程连接windows机器

    前段时间在本机安装了ubuntu16.04桌面版,后来需要远程连接一台win10系统的跳转机,下面介绍使用rdesktop命令远程连接windows机器的操作记录:1)首先安装rdesktop工具 k ...

  6. Centos6.9下RabbitMQ集群部署记录

    之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...

  7. zabbix监控交换机、防火墙等网络设备

    zabbix3.4.4监控交换机/防火墙是非简单,只需知道交换机/防火墙的snmp密码,然后连接下自带或导入的snmp模板,就可以完成监控了.比如添加地址为172.10.11.5的交换机监控. 1)登 ...

  8. Centos6.5网络配置

    由于项目部署的需要,不得不继续研究Linux,前期看过一些Linux方面的资料,也动手配置过Linux网络配置,但是由于开发项目一般在windows下进行的,用Linux比较少,所以基本上也就忘记以前 ...

  9. 撰写POPUSH需求文档

    不当家不知柴米贵,撰写了正规的软件需求文档才知道软件工程的复杂性 感谢@洪宇@王需@江林楠下午的加班加点,五个人正闷在406B奋斗中,加油!

  10. 12.16 Daily Scrum

      Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             邓亚梅             美化搜索框UI. 美 ...