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.

Examples

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 次小生成树模板:
lca+倍增+最小生成树
#define eps 1e-6
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N = ;
//*************************
int n, m;
//kruscal
struct tree
{
int a,b,w;
} p[N],s[N];
int p1[N];
int rk1[N];
//倍增
int fa[N][], max_e[N][], dep[N];
//lca
struct edge
{
int to, nxt,w;
} e[N<<];
int fst[N], tot;
struct query
{
int to,nxt;
int idx;
} Q[N<<];
int h[N],tt;
int p2[N],rk2[N];
int acr[N], ans[N];
bool vis[N];
//************************
void CLS()
{
tot = ;
memset(fst,-,sizeof(fst));
tt = ;
for(int i=; i<=n; i++)p1[i]=i,p2[i]=i;
memset(h,-,sizeof(h));
}
void add(int u,int v,int w)
{
e[++tot].to = v;
e[tot].w = w;
e[tot].nxt = fst[u];
fst[u] = tot;
}
void add_Q(int u,int v,int idx)
{
Q[++tt].to = v;
Q[tt].nxt = h[u];
Q[tt].idx = idx;
h[u] = tt;
}
//kruscal
bool cmp(tree x,tree y)
{
return x.w<y.w;
}
int find_p(int x)
{
return x == p1[x] ? x : p1[x]=find_p(p1[x]);
}
void uone1(int x,int y)
{
int t1=find_p(x);
int t2=find_p(y);
if(t1!=t2)
{
if(rk1[t1]>rk1[t2])p1[t2]=t1;
else p1[t1]=t2;
if(rk1[t1]==rk1[t2])rk1[t2]++;
}
}
ll kruscal()
{
ll res = ;
sort(p+, p+m+, cmp);
int cnt=;
for (int i = ; i <= m; i++)
{
int x=p[i].a;
int y=p[i].b;
int w=p[i].w;
if(find_p(x)!=find_p(y))
{
cnt++;
uone1(x,y);
res+=w;
add(x,y,w);
add(y,x,w);
if(cnt==n-)break;
}
}
return res;
} //倍增
void init_fa(int u, int p, int w)
{
dep[u] = dep[p] + ;
fa[u][] = p;
max_e[u][] = w;
for (int i = ; fa[u][i-]; i++)
{
fa[u][i] = fa[ fa[u][i-] ][i-];
max_e[u][i] = max(max_e[u][i-], max_e[ fa[u][i-] ][i-]);
}
} int cal(int u, int lca)
{
int d = dep[u] - dep[lca];
int res = ;
for(int i = ; i >= ; i--)
{
if ((<<i) <= d)
{
d -= (<<i);
res = max(res, max_e[u][i]);
u = fa[u][i];
}
}
return res;
} //LCA
int find_q(int x)
{
return x == p2[x] ? x : p2[x]=find_q(p2[x]);
}
void uone2(int x,int y)
{
int t1=find_q(x);
int t2=find_q(y);
if(t1!=t2)
{
if(rk2[t1]>rk2[t2])p2[t2]=t1;
else p2[t1]=t2;
if(rk2[t1]==rk2[t2])rk2[t2]++;
}
}
void LCA(int u)
{
vis[u] = ;
acr[u] = u;
for(int p = fst[u]; p != -; p = e[p].nxt)
{
int v = e[p].to;
if(vis[v]) continue;
init_fa(v, u, e[p].w);
LCA(v);
uone2(u,v);
acr[find_q(u)] = u;
}
for(int p = h[u]; p != -; p = Q[p].nxt)
{
int v = Q[p].to;
if(vis[v]) ans[Q[p].idx] = acr[find_q(v)];
}
} int main()
{
// freopen("input.txt", "r", stdin);
scanf("%d%d", &n, &m);
CLS();
for (int i = ; i <= m; i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
p[i].a=s[i].a=a;
p[i].b=s[i].b=b;
p[i].w=s[i].w=w;
add_Q(a,b,i);
add_Q(b,a,i);
}
ll tmp = kruscal();
LCA();
for (int i = ; i <= m; i++)
printf("%I64d\n", tmp+s[i].w-max(cal(s[i].a, ans[i]), cal(s[i].b, ans[i])));
return ;
}

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

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

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

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

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

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

  5. cf 609E.Minimum spanning tree for each edge

    最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...

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

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

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

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

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

随机推荐

  1. JS 为什么在涉及到模块开发this的时候使用类似 self = this 的形式 p7

    JS 动态作用域(调用栈)实际上也没有准确说明的,大多数我们使用对多和认知上大多是词法作用域,但是this的机制跟动态作用域很像. var a = 2; function fn(){ console. ...

  2. js-JavaScript常见的创建对象的几种方式

    1.通过Object构造函数或对象字面量创建单个对象 这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为了解决这个问题,出现了工厂模式. 2.工厂模式 考虑在ES中无法创建类( ...

  3. 走通Django的基本流程

    工程目录及文件的说明 manage.py:一个命令行工具,可以使我们用多种方式对Django项目进行交互 __init__.py:一个空文件,它告诉Python这个文件的上级目录应该看做一个pytho ...

  4. 【代码笔记】iOS-JQIndicatorViewDemo

    一,效果图. 二,工程图. 三,代码. #import "ViewController.h" #import "JQIndicatorView.h" @inte ...

  5. vue webpack 打包后css背景图路径问题

    最近在写vue-webpack项目时,打包后遇到了css背景图片路径报错的问题 奇怪的是,通过img标签引入的图片路径却没有问题,看来是webpack在打包后,读取css中图片的相对路径出错了. 稍微 ...

  6. SAP Overview

    SAP的全称:       Anwendungen Produkte in der Datenverarbeitung (德文,这是原西德产品),翻译成英文就是:System,Applications ...

  7. Oracle 修改oracle数据库名

    Oracle 修改oracle数据库名 by:授客 QQ:1033553122 1.确保你有个可用于数据库恢复的,完整的数据库备份 2.确保数据库处于mount,非open状态,并且在加载前先以imm ...

  8. 【Redis】Redis学习(五) Redis cluster模式详解

    一般情况下,使用主从模式加Sentinal监控就可以满足基本需求了,但是当数据量过大一个主机放不下的时候,就需要对数据进行分区,将key按照一定的规则进行计算,并将key对应的value分配到指定的R ...

  9. Hive Serde - CSV、TSV

    CSV hive-0.14.0内置支持CSV Serde,以前的版本需要引入第三方库的jar包(http://https://github.com/ogrodnek/csv-serde) 现在有个文本 ...

  10. [Android] 锁定屏幕

    最近玩的比较欢脱,欠了好多东西没写.今天先简单地补一篇简单的内容.就是最近涉及到一个锁定Android设备屏幕的设计,大概就是通过一个按钮或者服务消息,来控制设备界面完全锁定,不能点击任何东西.感觉上 ...