E. Minimum spanning tree for each edge

题目连接:

http://www.codeforces.com/contest/609/problem/E

Description

Connected undirected weighted graph without self-loops and multiple edges is given. Graph contains n vertices and m edges.

For each edge (u, v) find the minimal possible weight of the spanning tree that contains the edge (u, v).

The weight of the spanning tree is the sum of weights of all edges included in spanning tree.

Input

First line contains two integers n and m (1 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105) — the number of vertices and edges in graph.

Each of the next m lines contains three integers ui, vi, wi (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ wi ≤ 109) — the endpoints of the i-th edge and its weight.

Output

Print m lines. i-th line should contain the minimal possible weight of the spanning tree that contains i-th edge.

The edges are numbered from 1 to m in order of their appearing in input.

Sample Input

5 7

1 2 3

1 3 1

1 4 5

2 3 2

2 5 3

3 4 2

4 5 4

Sample Output

9

8

11

8

8

8

9

Hint

题意

给你一个图,n点m边。对于每个边,问你包含这条边的最小生成树是多少。

题解:

先生成一个最小生成树,加入一条边,可能会产生一个环,那么求这个环的最小值即可,

这个用倍增就行,就和求次小生成树一模一样。

今天typora终于可以用搜狗输入法了,我发现终端打开都用不了搜狗输入法,真奇怪呀。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 400050
ll n,m;
ll dp[N],mm[N],fu[N][21],mx[N][21];
ll tot,last[N];
struct Edge
{
ll from,to,val,s;
bool operator < (const Edge&b)
{return val<b.val;}
}a[N],edges[N];
template<typename T>void read(T&x)
{
ll k=0; char c=getchar();
x=0;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if (c==EOF)exit(0);
while(isdigit(c))x=x*10+c-'0',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
void AddEdge(ll x,ll y,ll z)
{
edges[++tot]=Edge{x,y,z,last[x]};
last[x]=tot;
}
ll gf(ll x,ll *f)
{
if (x==f[x])return x;
return f[x]=gf(f[x],f);
}
ll MST(Edge *edges)
{
static ll f[N]; static Edge a[N];
for(ll i=1;i<=m;i++)a[i]=edges[i];
ll num=0,sum=0;
sort(a+1,a+m+1);
for(ll i=1;i<=n;i++)f[i]=i;
for(ll i=1;i<=m;i++)
{
Edge e=a[i];//
ll fx=gf(e.from,f),fy=gf(e.to,f);
if (fx!=fy)//
{
f[fx]=fy;
num++;
sum+=e.val;
AddEdge(e.to,e.from,e.val);
AddEdge(e.from,e.to,e.val);
}
if (num==n-1)break;
}
return sum;
}
void dfs(ll x,ll pre)
{
dp[x]=dp[pre]+1;
fu[x][0]=pre;
for(ll i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if (e.to==pre)continue;
mx[e.to][0]=e.val;
dfs(e.to,x);
}
}
void init_ST(ll n)
{
mm[0]=-1;
for(ll i=1;i<=n;i++) mm[i]=(i&(i-1))==0?mm[i-1]+1:mm[i-1];
for(ll i=1;i<=20;i++)
for(ll j=1;j<=n;j++)
{
fu[j][i]=fu[fu[j][i-1]][i-1];
mx[j][i]=max(mx[j][i-1],mx[fu[j][i-1]][i-1]);
}
}
ll get_max(ll x,ll y)
{
ll ans=0;
if (dp[x]<dp[y])swap(x,y);
for(ll i=mm[dp[x]-dp[y]];i>=0;i--)
if (dp[fu[x][i]]>=dp[y])
{
ans=max(ans,mx[x][i]);
x=fu[x][i];
}
if (x==y)return ans;
for(ll i=mm[dp[x]-1];i>=0;i--)
if (fu[x][i]!=fu[y][i])
{
ans=max(ans,mx[x][i]);
ans=max(ans,mx[y][i]);
x=fu[x][i];
y=fu[y][i];
}
ans=max(ans,mx[x][0]);
ans=max(ans,mx[y][0]);
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
read(n); read(m);
for(ll i=1;i<=m;i++)
{
ll x,y,z;
read(x); read(y); read(z);
a[i]=Edge{x,y,z,0};
}
ll sum=MST(a);
dfs(1,0);
init_ST(n);
for(ll i=1;i<=m;i++)
{
ll ans=sum-get_max(a[i].from,a[i].to)+a[i].val;
printf("%lld\n",ans);
}
}

Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge 树上倍增的更多相关文章

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

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

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

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

  5. CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种

    题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...

  6. Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)

    题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...

  7. cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)

    先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 #include<bits/stdc++.h> # ...

  8. Minimum spanning tree for each edge(倍增LCA)

    https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...

  9. [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]

    这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...

随机推荐

  1. JetBrains IDE 基本快捷键

    转载自:https://nextfe.com/jetbrains-ide-shortcuts/ 一个好的手艺人很熟悉他的工具.软件开发者也不例外.所以,在编程的过程中,值得了解一些键盘快捷键,以免因为 ...

  2. Java源码分析-UUID

    原文链接:Little Apple's Blog 本文分析的JDK版本为1.8.0_131. UUID? UUID是Universally Unique Identifier的缩写:Java UUID ...

  3. 集合家族——LinkedList

    一.概述: LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现 ...

  4. Django基础之Session版登录验证

    from functools import wraps def check_login(func): @wraps(func) def inner(request, *args, **kwargs): ...

  5. premiere pro 2019 mac 破解

    链接:https://pan.baidu.com/s/14p1qj6pI1F3SP1SG4TUFHA  密码:seug

  6. UOJ社区版安装多个Judger

    目录 声明 在同一台机器上安装 在不同机子上安装 声明 本文档非官方文档,为我试坑的经验总结. 本文编写时间 2019.11.04 ,并不一定会随UOJ更新而更新. 由于UOJ需要用SVN传题,并不那 ...

  7. 计算可迭代对象的shape 老是忘~方便记法

    import numpy as np bbox =[ [[6.37532410e+02,3.83636505e+02,7.04683777e+02,4.43150146e+02, 6.23311400 ...

  8. Leetcode题目96.不同的二叉搜索树(动态规划-中等)

    题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 ...

  9. HDU2795线段树入门 简单查询和修改

    http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include<iostream> using namespace std; ; int h ...

  10. 笔记:Hive的主要技术改进(Major Technical Advancements in Apache Hive)

    http://web.cse.ohio-state.edu/hpcs/WWW/HTML/publications/papers/TR-14-2.pdf  (辅助参考:https://cwiki.apa ...