这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了

题目链接:609E - Minimum spanning tree for each edge

题目大意:n个点,m条边,对每条边,询问包含此边的最小生成树的边权之和

题解:大部分人都是用LCA写的,这里提供一个更为精妙的做法。

   模拟Kruskal算法建MST的过程,先将m条边按边权排序,依次进行判断。若点对(u,v)属于同一个连通块,则加入边{u,v,w}后会形成一个环,把环中最大的边换成w会多产生的权重就是包含这条边的MST比原先的MST多出来的权重,否则在MST中加入这条边。

   而这里加边的时候并不是选择直接在(u,v)之间连边,而是在他们的祖先之间连边,并有如下判断:若点v的子树大小大于点u的子树大小,则把v看做是u的父亲(将u所在的子树并入v),反之亦然。判断加边后是否会成环时,则只需暴力一层层寻找当前点的父亲即可,即是用O(n)的方法求LCA,但由于之前建树的方式用到了[small to large]的思想(就是启发式合并),所以往上爬的层数不会超过log n。因此时间复杂度为O(mlog n)。

#include<bits/stdc++.h>
using namespace std;
#define N 200001
#define LL long long
struct rua{LL u,v,w,id;}a[N];
LL n,m,mst,fa[N],f[N],sz[N],l[N];
bool cmp(rua x,rua y){return x.w<y.w;}
LL add(LL u,LL v,LL w)
{
LL mx=;
while((fa[u]!=u ||fa[v]!=v) && u!=v)
if(fa[u]==u || (fa[v]!=v && sz[v]<=sz[u]))
mx=max(mx,l[v]),v=fa[v];
else mx=max(mx,l[u]),u=fa[u];
if(u==v)return w-mx;
if(sz[u]<sz[v])swap(u,v);
sz[u]+=sz[v],fa[v]=u,l[v]=w;
return mst+=w,;
}
int main()
{
scanf("%I64d%I64d",&n,&m);
for(int i=;i<=m;i++)
scanf("%I64d%I64d%I64d",&a[i].u,&a[i].v,&a[i].w),sz[i]=,fa[i]=a[i].id=i;
sort(a+,a+m+,cmp);
for(int i=;i<=m;i++)
f[a[i].id]=add(a[i].u,a[i].v,a[i].w);
for(int i=;i<=m;i++)
printf("%I64d\n",mst+f[i]);
}

[Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]的更多相关文章

  1. 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 ...

  2. Educational Codeforces Round 3 E (609E) Minimum spanning tree for each edge

    题意:一个无向图联通中,求包含每条边的最小生成树的值(无自环,无重边) 分析:求出这个图的最小生成树,用最小生成树上的边建图 对于每条边,不外乎两种情况 1:该边就是最小生成树上的边,那么答案显然 2 ...

  3. codeforces 609E. Minimum spanning tree for each edge 树链剖分

    题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...

  4. cf 609E.Minimum spanning tree for each edge

    最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. WordPress主题开发:按分类调用文章

    调用catid为2的分类下的文章,就是后台分类链接的tag_ID <?php $cat_query = new WP_Query(array( 'cat' => '2' )); ?> ...

  2. python测试开发django-55.xadmin使用markdown文档编辑器(django-mdeditor)

    前言 markdown是一个非常好的编辑器,用过的都说好,如果搭建一个博客平台的话,需要在后台做文章编辑,可以整合一个markdown的文本编辑器. github上关于django的markdown插 ...

  3. 开发入门,学Java还是学大数据?

    经常有人问,我想学习开发,到底是学Java好还是学大数据好?或者是,学习大数据还有必要学Java吗?      依我说,这个提问的标准答案是:两者都学.      先来甩两张图.      一张是腾讯 ...

  4. Apache shiro如何实现一个账户同一时刻只有一个人登录

    继承AuthorizingRealm类,重写方法doGetAuthenticationInfo /** * 认证(登录时调用) */ @Override protected Authenticatio ...

  5. grid - 网格项目对齐方式(Box Alignment)

    CSS的Box Alignment Module补充了网格项目沿着网格行或列轴对齐方式. <view class="grid"> <view class='ite ...

  6. 在三台Centos或Windows中部署三台Zookeeper集群配置

    一.安装包 1.下载最新版(3.4.13):https://archive.apache.org/dist/zookeeper/  下载https://archive.apache.org/dist/ ...

  7. gdb fabs错误输出

    https://sourceware.org/gdb/wiki/FAQ GDB doesn't know the return type nor the type of the arguments f ...

  8. Irrlicht 3D Engine 笔记系列 之 自己定义Animator

    作者: i_dovelemon 日期: 2014 / 12 / 17 来源: CSDN 主题: Custom Animator, Referenced count 引言 在昨天的文章<Irrli ...

  9. Python中的__name__和类

    1.   python中if __name__ == '__main__': 的解析 经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是 ...

  10. 环境的配置; host 配置地址

    1.环境的配置: C:\Windows\System32\drivers\etc 2.如果没有下载host 切记复制etc的文件,在c盘桌面打开,更改后替换 3.可下载host 和fiddle 4.多 ...