cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)
先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树
#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+; 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;
}eg[maxn*],eg0[maxn];
int egh[maxn],ect;
int N,M;
int fa[maxn],f[maxn][],ma[maxn][],dep[maxn];
ll ans[maxn]; inline void adeg(int a,int b,int c){
eg[++ect].b=b;eg[ect].l=c;eg[ect].ne=egh[a];egh[a]=ect;
} inline bool cmp(Edge a,Edge b){return a.l<b.l;}
int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);} void dfs(int x){
for(int i=;f[x][i]&&f[f[x][i]][i];i++){
f[x][i+]=f[f[x][i]][i];
ma[x][i+]=max(ma[x][i],ma[f[x][i]][i]);
}
for(int i=egh[x];i;i=eg[i].ne){
int b=eg[i].b;
if(b==f[x][]) continue;
dep[b]=dep[x]+;
f[b][]=x;ma[b][]=eg[i].l;
dfs(b);
}
} ll get(int x,int y){
int re=;
if(dep[x]<dep[y]) swap(x,y);
for(int i=log2(dep[x]-dep[y]);i>=&&dep[x]!=dep[y];i--){
if(dep[f[x][i]]>=dep[y])
re=max(re,ma[x][i]),x=f[x][i];
}
if(x==y) return re;
for(int i=log2(dep[x]);i>=;i--){
if(f[x][i]!=f[y][i])
re=max(re,max(ma[y][i],ma[x][i])),x=f[x][i],y=f[y][i];
}
return max(re,max(ma[y][],ma[x][]));
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
eg0[i].a=rd(),eg0[i].b=rd(),eg0[i].l=rd();
eg0[i].ne=i;
}sort(eg0+,eg0+M+,cmp);
ll dis=;
for(i=;i<=N;i++) fa[i]=i;
for(i=,j=;i<=M&&j<N-;i++){
int aa=getf(eg0[i].a),bb=getf(eg0[i].b);
if(aa!=bb){
adeg(eg0[i].a,eg0[i].b,eg0[i].l);
adeg(eg0[i].b,eg0[i].a,eg0[i].l);
dis+=eg0[i].l;
fa[aa]=bb;j++;
}
}
dep[]=;dfs();
for(i=;i<=M;i++){
ans[eg0[i].ne]=dis+eg0[i].l-get(eg0[i].a,eg0[i].b);
}
for(i=;i<=M;i++){
printf("%I64d\n",ans[i]);
}
return ;
}
cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)的更多相关文章
- Minimum spanning tree for each edge(倍增LCA)
https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...
- CF609E Minimum spanning tree for each edge
原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- codeforces 609E Minimum spanning tree for each edge
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST
E. Minimum spanning tree for each edge Connected undirected weighted graph without self-loops and ...
- CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值
E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树+树链剖分+线段树
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge 树上倍增
E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...
随机推荐
- .NET Core在类库中读取配置文件appsettings.json
在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...
- QT 遇到的问题
遇到的问题: 1:在QT中使用opengl,发现一个很神奇的问题,个人感觉是qt的bug. 问题详情:在我添加了一个成员变量之后,使用opengl编写的窗口没有任何输出了,只有一个背景. 但是删除那个 ...
- [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl
UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...
- EF_DataFrist遇到的问题
正在 Code First 模式下将此上下文与从 EDMX 文件生成的用于 Database First 或 Model First 开发的代码一起使用.这将无法正常工作.若要解决此问题,请不要删除引 ...
- 轮廓(Outline) 实例
1.在元素周围画线本例演示使用outline属性在元素周围画一条线. <style type="text/css"> p{border:red solid thin;o ...
- nginx日志格式字段
Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志 访问日志主要记录 ...
- B. Divisor Subtraction
链接 [http://codeforces.com/contest/1076/problem/B] 题意 给你一个小于1e10的n,进行下面的运算,n==0 结束,否则n-最小质因子,问你进行多少步 ...
- 软件工程第二次程序的作业:Java计算器实验
1.计算器实验报告 2.https://github.com/lollipopangel/test/tree/master 3.实验截图 7+8 清除 六.总结 通过本次实验让我对JFrame类.JP ...
- HDU 2024 C语言合法标识符
http://acm.hdu.edu.cn/showproblem.php?pid=2024 Problem Description 输入一个字符串,判断其是否是C的合法标识符. Input 输入 ...
- 【转帖】Systemd 入门教程:命令篇
Systemd 入门教程:命令篇 Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...