codeforces 609E 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
保证某条边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的更多相关文章
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- codeforces 609E. Minimum spanning tree for each edge 树链剖分
题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...
- Educational Codeforces Round 3 E (609E) Minimum spanning tree for each edge
题意:一个无向图联通中,求包含每条边的最小生成树的值(无自环,无重边) 分析:求出这个图的最小生成树,用最小生成树上的边建图 对于每条边,不外乎两种情况 1:该边就是最小生成树上的边,那么答案显然 2 ...
- cf 609E.Minimum spanning tree for each edge
最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...
- 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 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 ...
随机推荐
- 论文笔记 | Self-organized Text Detection with Minimal Post-processing via Border Learning
论文链接:http://openaccess.thecvf.com/content_ICCV_2017/papers/Wu_Self-Organized_Text_Detection_ICCV_201 ...
- DB Intro - MongoDB User
MongoDB 3.0 用户创建 摘要: MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 环境.测试: 在安装Mo ...
- Ubuntu 14.04 下安装搜狗输入法,不要删除ibus
今天安装了 sougou输入法.在ubuntu下面,然后网上一般的帖子都是要求你先删除 ibus 但是你删除了ibus之后,就会导系统设置被删除很多设置项,甚至无法打开, 所有你设置ubuntu输入法 ...
- 现学现卖】IntelliJ+EmmyLua 开发调试Unity中Xlua
http://blog.csdn.net/u010019717/article/details/77510066?ref=myread http://blog.csdn.NET/u010019717 ...
- spark scala 例子
object ScalaApp { def main(args: Array[String]): Unit = { var conf = new SparkConf() conf.setMaster( ...
- SQLServer 2016 Express 安装部署,并配置支持远程连接
在项目中需要用到SQLServer,于是安装部署了SQLServer,部署的过程中遇到了一下问题,记录一下以便之后遇到同样问题能快速解决. 一.安装包下载 首先下载必要的安装包: 1.SQLServe ...
- 通过学生-课程关系表,熟悉hive语句
通过学生-课程关系表,熟悉hive语句 1.在hive中创建以下三个表. create table student(Sno int,Sname string,Sex string,Sage int, ...
- oracle学习篇三:SQL查询
select * from emp; --1.找出部门30的员工select * from emp where deptno = 30; --2.列出所有办事员(CLERK)的姓名,变化和部门编号se ...
- BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
题意 题目链接 Sol 震惊,HNOI竟出NOI原题 直接在反图上贪心一下. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include& ...
- 1729 单词查找树 2000年NOI全国竞赛
1729 单词查找树 2000年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 在进行文法分析的 ...