cf827D Best Edge Weight (kruskal+倍增lca+并查集)
先用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+并查集)的更多相关文章
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
[题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...
- 【BZOJ-3910】火车 倍增LCA + 并查集
3910: 火车 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 262 Solved: 90[Submit][Status][Discuss] De ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- BZOJ 4144 Dijkstra+Kruskal+倍增LCA
思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...
- BZOJ 3732 Network Kruskal+倍增LCA
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...
- CF827D Best Edge Weight 题解
题意: 给定一个点数为 n,边数为 m,权值不超过 \(10^9\) 的带权连通图,没有自环与重边. 现在要求对于每一条边求出,这条边的边权最大为多少时,它还能出现在所有可能的最小生成树上,如果对于任 ...
- 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 ...
- [学习笔记]kruskal重构树 && 并查集重构树
Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...
- CF1253F Cheap Robot(神奇思路,图论,最短路,最小生成树/Kruskal 重构树/并查集)
神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全 ...
随机推荐
- virtual box问题记录
1.已存在的虚拟机打开错误,可能是版本不一样的问题,我5.2.16版本,原虚拟机所属版本为4.3.12,换回4.3.12版本virtual box即可.
- Postgres使用ALTER USER命令修改用户的密码、密码过期,锁定,解锁
使用ALTER USER命令修改用户的密码.密码过期,锁定,解锁 (1)修改用户的口令,将用户的口令修改为新的密码 highgo=#create user test with password ‘te ...
- Microsoft Office软件自定义安装目录
Microsoft Office安装时不能手动设置安装目录,本文描述通过修改注册表的方式自定义安装目录 1.同时按下快捷键 win + r 启动运行 2.输入 regedit 打开注册表 3.找到 ...
- 图像数据增强 (Data Augmentation in Computer Vision)
1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟 ...
- libmysqlclient.so.16: cannot open shared object file: No such file or directory
编译安装的mysql5.6.39,安装目录是/usr/local/mysql,启用程序时报错:libmysqlclient.so.16: cannot open shared object file: ...
- 分布式监控系统Zabbix-图形集中展示插件Graphtree安装笔记
Zabbix想要集中展示图像,唯一的选择是screen,后来zatree解决了screen的问题,但性能不够好.Graphtree 由OneOaaS开发并开源出来,用来解决Zabbix的图形展示问题, ...
- 个人作业 - Week3 - 案例分析
调研与评测 真实用户采访: 用户姓名: 刘斯盾 用户的背景和需求: 用户是一位计算机专业学生,需要浏览技术博客来扩充自己的学识. 用户使用博客园证明: 产品是否解决用户问题: 在码代码过程中遇到的很多 ...
- Eclipse使用Maven2的一次环境清理记录
1. C:\Users\Administrator\.m2\repository\com\yuanchuangyun\[module,yuanchuangyun-*]相关目录全删除.2. D:\wor ...
- Event事件2
1,阻止默认行为: 2,事件监听 3,事件流之事件捕获 4,事件委托 阻止默认行为 浏览器中有很多默认行为,比如当点击a标签后,会发生链接的跳转.当点击鼠标的右键时, 会显示右键菜单等. 有些时候,浏 ...
- docker 下运行 postgresql 的命令
postgresql docker下启动的命令 docker run --name pgdata -p : -e POSTGRES_PASSWORD=Test6530 -v /pgdata:/var/ ...