这题本来是想放在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. Nancy的基本用法

    在前面的文章轻量级的Web框架——Nancy中简单的介绍了一下Nancy的特点,今天这里就介绍下它的基本用法,由于2.0的版本还是预览状态,我这里用的是1.4版本,和最小的版本API还是有些差异的. ...

  2. 超过 130 个你需要了解的 vim 命令

    从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一.5年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你会 ...

  3. windows Docker Desktop 搭建mysql,mssql和redis服务

    其实网上关于docker上搭建mysql的文章已经很多了,只是今晚自己搭建的时候遇到一些问题,记录一下 1.首先是pull image , docker pull mysql 2.启动服务 docke ...

  4. ViewPager Fragment 懒加载 可见 总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. How do I remove a particular element from an array in JavaScript?

    9090down voteaccepted Find the index of the array element you want to remove, then remove that index ...

  6. WIN10系统提示无法使用内置管理员账户打开XXX应用程序怎么办

    重装了系统之后,只保留Administrator账户,结果打开程序的时候回弹出这个提示   运行,输入secpol.msc   本地策略-安全选项,启用下面这个,然后重启计算机      

  7. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...

  8. js 的学习

    day41 学习链接:https://www.cnblogs.com/yuanchenqi/articles/5980312.html 知识结构: BOM对象 DOM对象(DHTML) 一个完整的Ja ...

  9. Canvas入门到高级详解(中)

    三. canvas 进阶 3.1 Canvas 颜色样式和阴影 3.1.1 设置填充和描边的颜色(掌握) fillStyle : 设置或返回用于填充绘画的颜色 strokeStyle: 设置或返回用于 ...

  10. Windows7系统不显示.gitignore文件名

    从码云拉取项目后,发现Win7下不能显示.giignore文件名. 这是因为Win7系统默认隐藏了已知的拓展名,而.gitignore逗号前没有字符,于是显示的文件命是空白的. 打开工具—文件夹选项, ...