这题本来是想放在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. set non-stop on

    # Enable the async interface. set target-async 1 # If using the CLI, pagination breaks non-stop. set ...

  2. 使用Qemu运行Ubuntu文件系统(1)

    参考 https://blog.csdn.net/mountzf/article/details/51707853 https://blog.csdn.net/stephen_lu_fahai/art ...

  3. SpringBoot无废话入门04:MyBatis整合

    1.Parent引入及pom配置 首先,如果要支持mybatis,那么我们就应该引入mybatis的starter.同时,由于连接本身还需要用jdbc的connetor和连接池,所以一并需要引入这些依 ...

  4. golang time打印出的值是62135596800的来源

    ' 减去62135596800是将"以公元1年1月1日0点为基准"改成"以1970年1月1日0点"为基准 所以,数据库datetime的默认值 : 0000-0 ...

  5. 网络编程之 keepalive(zz)

    link1: http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ link2: http://dev.csdn.net/article/849 ...

  6. zookeeper三节点集群安装记录

    以下是3个节点的zk安装记录. 下载 下载地址: http://mirrors.shu.edu.cn/apache/zookeeper/ cd /data/opt/zk wget http://mir ...

  7. laravel实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 laravel是我工作10多年来见到的真正能称得上让phper从面条一样杂乱的代 ...

  8. VirtualBox虚拟机磁盘瘦身

    操作系统 : windows7_x64 VirtualBox 版本 : 4.3.28 原理: 使用0填充虚拟系统磁盘,然后删除填充文件,再使用VBoxManage进行压缩. Linux系统磁盘瘦身 一 ...

  9. xsd文件规则和语法

    1.简介 XSD即XML结构定义, XML Schemas Definition.其本身就是用xml描述的, 且遵循xml语法规则.一份XML schema文件描述了XML文档的结构. 基本规则:   ...

  10. C++中的三种继承关系

    C++中的三种继承关系 先看类中声明成员时的三种访问权限 public : 可以被任意实体访问 protected : 只允许子类及本类的成员函数访问 private : 只允许本类的成员函数访问 在 ...