E. Minimum spanning tree for each edge
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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 test(s)
input
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
output
9
8
11
8
8
8
9

保证某条边e存在的MST就是普通Kruskal把e优先到了最前面。

先求一遍MST,如果e不再MST上,是因为形成了环,把环上除了e的最大权边去掉就好了。

(以前的LCA:用ST来RMQ,查询O(1)

(向祖先结点倍增其实和ST差不多,查询O(logn),维护信息灵活

(一开始想的是树剖,复杂度稍高

#include<bits/stdc++.h>
using namespace std; typedef long long ll; const int N = 2e5+, M = N*; int pa[N], rak[N];
int fd(int x){ return pa[x] ? pa[x] = fd(pa[x]) : x; }
bool unite(int x,int y)
{
int a = fd(x), b = fd(y);
if(a == b) return false;
if(rak[a] < rak[b]){
pa[a] = b;
}
else {
pa[b] = a;
if(rak[a] == rak[b]) rak[a]++;
}
return true;
} int fro[N], to[N], we[N]; int hd[N];
int nx[M], ver[M], wei[M];
int ec; void add_e(int u,int v,int w)
{
ver[++ec] = v;
wei[ec] = w;
nx[ec] = hd[u];
hd[u] = ec;
} int n, m;
int *cmp_c;
bool cmp_id(int i,int j){ return cmp_c[i] < cmp_c[j]; } int r[N];
ll kruskal()
{
ll re = ;
int i,j;
for(i = ; i <= m; i++) r[i] = i;
cmp_c = we;
sort(r+, r + + m, cmp_id);
//ec = 0;
for(i = ; i <= m; i++){
j = r[i];
if(unite(fro[j],to[j])){
add_e(fro[j],to[j],we[j]);
add_e(to[j],fro[j],we[j]);
re += we[j];
we[j] = ;
}
}
return re;
} const int LOG = ; int fa[N][LOG], mx[N][LOG];
int dep[N]; void dfs(int u,int f = ,int fw = ,int d = )
{
fa[u][] = f;
mx[u][] = fw;
dep[u] = d;
for(int i = hd[u]; i; i = nx[i]) {
int v = ver[i];
if(v == f) continue;
dfs(v,u,wei[i],d+);
}
} int lg; int queryMx(int u,int v)
{
int re = , i;
if(dep[u] < dep[v]) swap(u,v);
for(i = lg; i >= ; i--) if(dep[u] - (<<i) >= dep[v]){
re = max(re,mx[u][i]);
u = fa[u][i];
}
if(u == v) return re;
for(i = lg; i >= ; i--) if(fa[u][i] != fa[v][i]){
re = max(re,max(mx[u][i],mx[v][i]));
u = fa[u][i];
v = fa[v][i];
}
return max(re,max(mx[u][],mx[v][]));
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
//cout<<log2(N);
scanf("%d%d",&n,&m);
int i,j;
for(i = ; i <= m; i++){
scanf("%d%d%d",fro+i,to+i,we+i);
}
ll mst = kruskal(); dfs();
lg = ceil(log2(n));
for(j = ; j <= lg; j++){
for(i = ; i <= n; i++) if(fa[i][j-]){
fa[i][j] = fa[fa[i][j-]][j-];
mx[i][j] = max(mx[i][j-],mx[fa[i][j-]][j-]);
}
}
for(i = ; i <= m; i++) {
printf("%I64d\n",we[i]?mst + we[i] - queryMx(fro[i],to[i]):mst);
}
return ;
}

codeforces 609E Minimum spanning tree for each edge的更多相关文章

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

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

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

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

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

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

  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. base64的python实现

    写了一个函数,自己按照base64的规则转换一个字符串. # /usr/bin/python # encoding: utf-8 base64_table = ['A', 'B', 'C', 'D', ...

  2. PIE SDK元素事件的监听

    1功能简介 元素在操作的过程中,如添加,删除,选中等操作都需要有事件的监听,PIE SDK支持对元素操作事件的监听,下面对元素事件的监听进行介绍. 2功能实现说明 2.1.1 实现思路及原理说明 第一 ...

  3. vue组件中camelCased (驼峰式) 命名与 kebab-case(短横线命名)

    HTML 特性是不区分大小写的.所以,当使用的不是字符串模版,camelCased (驼峰式) 命名的 prop 需要转换为相对应的 kebab-case (短横线隔开式) 命名: 如果你使用字符串模 ...

  4. CI 框架中的日志处理 以及 404异常处理

    最近在整理项目中的日志问题,查了一些关于 “CI 框架中的日志处理 以及 404异常处理” 的东西,顺便记录一下: 关于错误日志: 1. 在CI框架中的 system/core/CodeIgniter ...

  5. JUnit异常断言

    使用Junit时,有多种方式来进行异常的断言 ExeceptedException & @Rule,可以同时断言异常类型和消息 public class ExpectedExceptionsT ...

  6. git读书笔记以及使用技巧

    [添加文件] git add  把文件修改添加到暂存区    git commit -m '' 把暂存区的所有内容提交到当前分支 [查看历史]    git log 查看提交历史 git log -- ...

  7. ife task0003学习笔记(二):JavaScript原型

    function aaa(){} aaa.prototype.bbb=function(){} var obj1=new aaa() var obj2=new aaa() obj1和obj2都有一个属 ...

  8. mongodb insert()、save()的区别

    mongodb 的 insert().save()  ,区别主要是:若存在主键,insert()  不做操作,而save() 则更改原来的内容为新内容. 存在数据:  { _id : 1, " ...

  9. 03.枚举和string以及int类型之间的转换

    练习1:   将枚举类型强转成int类型 namespace _04.枚举类型的练习01 { //声明一个QQState类型的枚举 public enum QQState { OnLine, OffL ...

  10. HashMap和Hashtable存放null

    Hashmap是可以放key为null的,Hashtable不能放key为null.hashtable放key为null会报空指针异常 1. hashmap put方法源码 public V put( ...