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 ...
随机推荐
- 解读 --- 基于微软企业商务应用平台 (Microsoft Dynamics 365) 之上的人工智能 (AI) 解决方案
9月25日微软今年一年一度的Ignite 2017在佛罗里达州奥兰多市还是如期开幕了.为啥这么说?因为9月初五级飓风厄玛(Hurricane Irma) 在佛罗里达州登陆,在当地造成了挺大的麻烦.在这 ...
- java发起HTTP请求的共用类
一定要注意编码,请求时,content-type里的编码,仅仅是流的编码,而结果的编码类型,则是流转化为字符串是需要设定的. 以下是3种使用get/post的方式: import java.io.Bu ...
- Ubuntu16.10上安装NodeJS6.9.2
1.下载 https://nodejs.org/en/download/ 2.解压 tar -xJf node-v6.9.2-linux-x64.tar.xz 3. 移到通用的软件安装目录 /opt/ ...
- phar 反序列化学习
前言 phar 是 php 支持的一种伪协议, 在一些文件处理函数的路径参数中使用的话就会触发反序列操作. 利用条件 phar 文件要能够上传到服务器端. 要有可用的魔术方法作为"跳板&qu ...
- idea常规设置
java开发目前很多都是使用IntelliJ IDEA这款神器.废话不多说,官网地址:https://www.jetbrains.com/idea/ 我一直都是保持最新版本,安装之后注册. 首先需要安 ...
- [转载]Buffer cache的调整与优化
Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的free buffer waits事件.下面将具体描 ...
- python基础一数据类型之元祖
摘要: python基础一中写到数据类型元祖,那么这篇主要讲元祖. 1,元祖定义 tuple1 = (1,2,'a','b') 元祖是不可变数据,所以又名只读列表.那么如何让是元祖可变呢?可以在元祖中 ...
- Oracle EBS OM 创建订单
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- 反向代理负载均衡调度:nginx
一.概述 反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个 ...
- SQL 时间戳转换为日期
, '1970-01-01 00:00:00') 其中Timestamp为10位的时间戳,+8*3600是获取中国北京时间(东八区)