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\) 全 ...
随机推荐
- 使用Pyspark进行特征工程时的那些坑
以脚本spark_clean_online_action.py.数据集new_sxf_time_count_1781115582.csv为例: 集群节点包括212.216.217.218.需要注意的是 ...
- InnoDB 文件系统
1. 操作系统文件系统inode 2. InnoDB的存储结构 2.1Innodb inode page 参考 http://mysql.taobao.org/monthly/2016/02/01/ ...
- IOS 上架到App Store被拒的常见问题总结
Guideline 2.3.3 - Performance - Accurate Metadata 2017年11月16日 上午12:52 发件人 Apple 2. 3 Performance: Ac ...
- 值类型和引用类型的区别,struct和class的区别
C#值类型和引用类型 1.简单比较 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long,floa ...
- 免费的 Vue.js 入门与进阶视频教程
这是我免费发布的高质量超清「Vue.js 入门与进阶视频教程」. 全网最好的.免费的 Vue.js 视频教程,课程基于 Vue.js 2.0,由浅入深,最后结合实际的项目进行了最棒的技术点讲解,此课程 ...
- 作业20171026 alpha-2及alpha发布成绩
申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年11月21日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...
- Microsoft Visual Studio 2013安装及试用
我是在网上下载的vs2013版的安装包,下载的是压缩文件,解压后是2.86GB.安装包下载完成后我们就可以进入安装了. 同时建议最好在互联网连接的情况下安装. 打开下载好的文件,我们要选择.exe可执 ...
- 2-Twenty First Scrum Meeting-20151221
任务安排 成员 今日完成 明日任务 闫昊 请假(数据库) 唐彬 请假(数据库) 史烨轩 尝试使用downloadmanager对notification进行更新 尝试使用downloadm ...
- Linux内核分析第四章读书笔记
第四章 进程调度 进程调度程序:确保进程能有效工作的一个内核子程序 决定将哪个进程投入运行,何时运行已经运行多长时间 进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统 原则:只 ...
- 网络:LVS负载均衡原理
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上.为 ...