这题本来是想放在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. sshd服务

    SSHD服务 介绍:SSH 协议:安全外壳协议.为 Secure Shell 的缩写.SSH 为建立在应用层和传输层基础上的安全协议. 作用 sshd服务使用SSH协议可以用来进行远程控制, 或在计算 ...

  2. nginx配置http访问自动跳转到https

    1.按照如下格式修改nginx.conf 配置文件,80端口会自动转给443端口,这样就强制使用SSL证书加密了.访问http的时候会自动跳转到https上面 server { listen ; se ...

  3. AssemblyInfo.cs文件详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq395537505/article/details/49661555 一.前言 .net工程的Pr ...

  4. MYSQL的联合查询最好是少用,效能差异巨大

    同样的功能,不同的写法,时间和内存占用差了几千倍,不废话,直接上代码 第一种写法: 代码如下: $Rs=DB::get($_ENV['DB'],3,"SELECT * FROM _xiazh ...

  5. linux-网站收藏

    创建sudo无密码登陆 http://www.aboutyun.com/blog-61-428.html

  6. GoAccess日志分析工具

    1.1 GoAccess简介 GoAccess是一个非常良心的开源软件,它的良心之处体现在如下方面: 1)安装简单: 2)操作容易: 3)界面酷炫: GoAccess 官网 https://goacc ...

  7. Switch语句的参数是什么类型的?

    在Java5以前,switch(expr)中,exper只能是byte,short,char,int类型. 从Java5开始,java中引入了枚举类型,即enum类型. 从Java7开始,exper还 ...

  8. MySQL执行计划解析

    前言 在实际数据库项目开发中,由于我们不知道实际查询时数据库里发生了什么,也不知道数据库是如何扫描表.如何使用索引的,因此,我们能感知到的就只有SQL语句的执行时间.尤其在数据规模比较大的场景下,如何 ...

  9. MySQL入门很简单-触发器

    1.触发器是由事件来触发某个操作,这些事件包括insert语句.update语句和delete语句.当数据库系统执行这些事件时,会激活触发器执行相应操作.MySQL从5.0.2开始支持触发器.使用触发 ...

  10. django项目settings.py的基础配置

    一个新的django项目初始需要配置settings.py文件: 1. 项目路径配置 新建一个apps文件夹,把所有的项目都放在apps文件夹下,比如apps下有一个message项目,如果不进行此项 ...