609E- Minimum spanning tree for each edge
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
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 次小生成树模板:
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的更多相关文章
- [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
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- Educational Codeforces Round 3 E (609E) Minimum spanning tree for each edge
题意:一个无向图联通中,求包含每条边的最小生成树的值(无自环,无重边) 分析:求出这个图的最小生成树,用最小生成树上的边建图 对于每条边,不外乎两种情况 1:该边就是最小生成树上的边,那么答案显然 2 ...
- codeforces 609E. Minimum spanning tree for each edge 树链剖分
题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...
- cf 609E.Minimum spanning tree for each edge
最小生成树,lca(树链剖分(太难搞,不会写)) 问存在这条边的最小生成树,2种情况.1.这条边在原始最小生成树上.2.加上这条半形成一个环(加上),那么就找原来这条边2端点间的最大边就好(减去).( ...
- 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 ...
- 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 ...
- 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 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 ...
随机推荐
- Css中display:inline-block用法详解
display:block就是将元素显示为块级元素 block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div&g ...
- 【代码笔记】iOS-自定义alertView
一,效果图. 二,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewContro ...
- Hystrix 框架
雪崩效应的产生原因:当一个服务突然受到高并发的请求,tomcat服务器承受不了的情况下会产生服务堆积,可能导致其他的服务也不可用. 服务保护:当服务产生堆积的时候,对服务实现保护功能. 服务隔离:每个 ...
- lastIndex()与IndexOf()的区别
lastIndex()与IndexOf()的区别 str.indexOf() indexOf()方法返回某个指定的字符串值在字符串中首次出现的位置(从左向右).没有匹配的则返回-1,否则返回首次出现位 ...
- PDO预处理语句
1.造PDO对象$dsn = "mysql:dbname=mydb;host=localhost";$pdo = new PDO($dsn,"root",&qu ...
- Clumsy 弱网络环境模拟工具使用介绍
Clumsy 弱网络环境模拟工具使用介绍 by:授客 QQ:1033553122 简介 利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时 ...
- Java IO流学习总结一:输入输出流
Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...
- GenyMotion the virtual device got no ip address 问题解决
不要再找答案了 升级你的virtual box到最新版本(目前是 5.0.26,已通过) 如果你是windows 10系统 必须关闭hyper-v 在管理员命令行下运行bcdedit /set hyp ...
- LeetCode 题解之Most Common Word
1.题目描述 2.题目分析 首先将输入句子拆分成单词,在这个过程中将所有大写字母变换成小写字母,将每一个单词作为一个字符串放入一个 map<string,int> 容器中,最后遍历容器,查 ...
- 用JS实现判断iframe是否加载完成
本文出至:新太潮流网络博客 var iframe = document.createElement("iframe"); iframe.src = "blog.iinu. ...