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 题意:给你一个n个点,m条边的无向图。对于每一条边,求包括该边的最小生成树
我们首先想到的是,求一次整图的MST后,对于每一条边(u,v),如果该边在整图的最小生成树上,答案就是MST,否则,加入的边(u,v)就会使原来的最小生成树成环,可以通过LCA确定该环,那么我们只要求出点u到LCA(u,v)路径上的最大边权和v到LCA(u,v)路径上的最大边权中的最大值mx,MST - mx + w[u,v]就是答案了
其中gx[u][i]表示节点u到其第2^i个祖先之间路径上的最大边权
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + ;
const int DEG = ;
typedef long long ll;
struct edge {
int v, w, next;
edge() {}
edge(int v, int w, int next) : v(v), w(w), next(next){}
}e[N << ]; int head[N], tot;
int fa[N][DEG], deg[N];
int gx[N][DEG];
void init() {
memset(head, -, sizeof head);
tot = ;
}
void addedge(int u, int v, int w) {
e[tot] = edge(v, w, head[u]);
head[u] = tot++;
}
void BFS(int root) {
queue<int> que;
deg[root] = ;
fa[root][] = root;
gx[root][] = ;
que.push(root);
while(!que.empty()) {
int tmp = que.front();
que.pop();
for(int i = ; i < DEG; ++i) {
fa[tmp][i] = fa[ fa[tmp][i - ] ][i - ];
gx[tmp][i] = max(gx[tmp][i - ], gx[ fa[tmp][i - ] ][i - ]);
// printf("[%d %d] ", tmp, gx[tmp][i]);
}
// puts("");
for(int i = head[tmp]; ~i; i = e[i].next) {
int v = e[i].v;
int w = e[i].w;
if(v == fa[tmp][]) continue;
deg[v] = deg[tmp] + ;
fa[v][] = tmp;
gx[v][] = w;
que.push(v);
}
}
}
int Mu, Mv;
ll LCA(int u, int v) {
Mu = Mv = -;
if(deg[u] > deg[v]) swap(u, v);
int hu = deg[u], hv = deg[v];
int tu = u, tv = v;
for(int det = hv - hu, i = ; det; det >>= , ++i)
if(det & ) { Mv = max(Mv, gx[tv][i]); tv = fa[tv][i]; }
if(tu == tv) return Mv;
for(int i = DEG - ; i >= ; --i) {
if(fa[tu][i] == fa[tv][i]) continue;
Mu = max(Mu, gx[tu][i]);
Mv = max(Mv, gx[tv][i]);
tu = fa[tu][i];
tv = fa[tv][i]; }
return max(max(Mu, gx[tu][]), max(Mv, gx[tv][]));
} int U[N], V[N], w[N], r[N], f[N];
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
bool cmp(int a, int b) { return w[a] < w[b]; }
ll MST;
int n, m;
void mst() { scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i) {
scanf("%d%d%d", &U[i], &V[i], &w[i]);
r[i] = i;
f[i] = i;
}
sort(r + , r + m + , cmp);
MST = ;
for(int i = ; i <= m; ++i)
{
int id = r[i];
int fu = find(U[id]);
int fv = find(V[id]);
if(fu != fv) {
MST += w[id];
f[ fu ] = fv;
addedge(U[id], V[id], w[id]);
addedge(V[id], U[id], w[id]);
}
}
}
int main() {
init();
mst();
BFS(); for(int i = ; i <= m; ++i) {
printf("%I64d\n", MST - LCA(U[i], V[i]) + w[i]);
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【python】An Introduction to Interactive Programming in Python(week two)

    This is a note for https://class.coursera.org/interactivepython-005 In week two, I have learned: 1.e ...

  2. 【Git】笔记2

    来源:廖雪峰 安装git(ubuntu) sudo apt-get install git 创建版本库(repository)  在想生成版本库的文件夹下输入: git init 指定用户名和邮箱 g ...

  3. mysql TIMESTAMP 报错

    [Err] 1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTA ...

  4. 非Unicode工程读取Unicode文件

    MyUnicodeReader.h #pragma once /******************************************************************** ...

  5. Centos7 设置Swap分区

    1.使用dd命令创建一个swap交换文件 dd if=/dev/zero of=/home/swap bs=1024 count=1024000 2.制作为swap格式文件: mkswap /home ...

  6. UVA 111 History Grading

    读题读了好久,其实就是在输入数据时要对数据的位置进行相应的改变 #include<iostream> #include<cstring> #include<cstdio& ...

  7. Android Tab -- 使用Fragment、FragmentManager来实现

    原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果: 代码:https://github.com/ldb-github/La ...

  8. mysql 源码安装

    yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl-CPAN libpng libpng-devel freetyp ...

  9. Android画面显示原理

    转自: http://blog.csdn.net/luoshengyang/article/details/7691321/ http://blog.chinaunix.net/uid-1675954 ...

  10. SQL数据字符串的拆分

    一.概述: MSSQL字符串的拆分没有封装太多常用的方式,所以如果向数据库中插入用特殊字符分割字符串(比如CB0$CB2$CB3,CB0$CB2$CB3)时就可能需要数据库能够分割字符串,SQL中拆分 ...