Codeforces Edu3 E. Minimum spanning tree for each edge
2 seconds
256 megabytes
standard input
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.
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.
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.
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- 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 ...
- 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 ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)
题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...
- CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种
题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...
随机推荐
- 【linux】ubuntu stmp服务器配置
来源:http://blog.itpub.net/786540/viewspace-1002077/ sudo apt-get install sendmail(其中已经包含了sendmail-bin ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- POJ 1753 Flip game ( 高斯消元枚举自由变量)
题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...
- Hibernate创建hqll时报错
Hibernate 问题,在执行Query session.createQuery(hql) 报错误 出错截图: 这条语句在java运行环境下,直接连数据库不出错,如果在hiberante,strut ...
- 备忘zookeeper(单机+伪集群+集群)
#下载: #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime ...
- Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...
- samba 最简单配置 共享
[root@GitLab ~]# cat /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = David Samba ...
- MVC基础知识 – 2.新语法
1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和 命名参数 4.对象初始化器 与 集合初始化器 { } 5.匿名类 & 匿名方法 ...
- 【数据库】 防止sql注入,过滤敏感关键字
private bool FilterIllegalChar(string sWord) { var result = false; var keyWord = @"select|inser ...
- 【C#】 用Route进行URL重写
在.NET Framework 4中,微软推出了Route机制.这种机制不仅在MVC中大量运用,在WebForm中也可以使用. 和Contex.RewritePath()一样,Route功能也是写在G ...