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
Description
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 Input
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
Sample Output
9
8
11
8
8
8
9
Hint
题意
给你一个图,n点m边。对于每个边,问你包含这条边的最小生成树是多少。
题解:
先生成一个最小生成树,加入一条边,可能会产生一个环,那么求这个环的最小值即可,
这个用倍增就行,就和求次小生成树一模一样。
今天typora终于可以用搜狗输入法了,我发现终端打开都用不了搜狗输入法,真奇怪呀。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 400050
ll n,m;
ll dp[N],mm[N],fu[N][21],mx[N][21];
ll tot,last[N];
struct Edge
{
ll from,to,val,s;
bool operator < (const Edge&b)
{return val<b.val;}
}a[N],edges[N];
template<typename T>void read(T&x)
{
ll k=0; char c=getchar();
x=0;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if (c==EOF)exit(0);
while(isdigit(c))x=x*10+c-'0',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
void AddEdge(ll x,ll y,ll z)
{
edges[++tot]=Edge{x,y,z,last[x]};
last[x]=tot;
}
ll gf(ll x,ll *f)
{
if (x==f[x])return x;
return f[x]=gf(f[x],f);
}
ll MST(Edge *edges)
{
static ll f[N]; static Edge a[N];
for(ll i=1;i<=m;i++)a[i]=edges[i];
ll num=0,sum=0;
sort(a+1,a+m+1);
for(ll i=1;i<=n;i++)f[i]=i;
for(ll i=1;i<=m;i++)
{
Edge e=a[i];//
ll fx=gf(e.from,f),fy=gf(e.to,f);
if (fx!=fy)//
{
f[fx]=fy;
num++;
sum+=e.val;
AddEdge(e.to,e.from,e.val);
AddEdge(e.from,e.to,e.val);
}
if (num==n-1)break;
}
return sum;
}
void dfs(ll x,ll pre)
{
dp[x]=dp[pre]+1;
fu[x][0]=pre;
for(ll i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if (e.to==pre)continue;
mx[e.to][0]=e.val;
dfs(e.to,x);
}
}
void init_ST(ll n)
{
mm[0]=-1;
for(ll i=1;i<=n;i++) mm[i]=(i&(i-1))==0?mm[i-1]+1:mm[i-1];
for(ll i=1;i<=20;i++)
for(ll j=1;j<=n;j++)
{
fu[j][i]=fu[fu[j][i-1]][i-1];
mx[j][i]=max(mx[j][i-1],mx[fu[j][i-1]][i-1]);
}
}
ll get_max(ll x,ll y)
{
ll ans=0;
if (dp[x]<dp[y])swap(x,y);
for(ll i=mm[dp[x]-dp[y]];i>=0;i--)
if (dp[fu[x][i]]>=dp[y])
{
ans=max(ans,mx[x][i]);
x=fu[x][i];
}
if (x==y)return ans;
for(ll i=mm[dp[x]-1];i>=0;i--)
if (fu[x][i]!=fu[y][i])
{
ans=max(ans,mx[x][i]);
ans=max(ans,mx[y][i]);
x=fu[x][i];
y=fu[y][i];
}
ans=max(ans,mx[x][0]);
ans=max(ans,mx[y][0]);
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
read(n); read(m);
for(ll i=1;i<=m;i++)
{
ll x,y,z;
read(x); read(y); read(z);
a[i]=Edge{x,y,z,0};
}
ll sum=MST(a);
dfs(1,0);
init_ST(n);
for(ll i=1;i<=m;i++)
{
ll ans=sum-get_max(a[i].from,a[i].to)+a[i].val;
printf("%lld\n",ans);
}
}
Codeforces Educational Codeforces Round 3 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 ...
- 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 ...
- CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种
题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)
题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...
- cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)
先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树 #include<bits/stdc++.h> # ...
- Minimum spanning tree for each edge(倍增LCA)
https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
随机推荐
- codeforces#1183F. Topforces Strikes Back(数论)
题目链接: http://codeforces.com/contest/1183/problem/F 题意: 给出n个数,找出最多三个互不整除的数,取最大的和 数据范围: $1 \le n \le 2 ...
- 1.3 JAVA规范以及基础语法(if条件和循环)
一.规范以及运算符 1.命名规则 类名大驼峰规则方法名.变量名小驼峰原则常量大写.下划线分开见名释义.不与关键字冲突 关键字链接:https://www.runoob.com/java/java-ba ...
- js 中null,undefined区别
首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...
- 实例分析jdom和dom4j的使用和区别 (转)
实例分析jdom和dom4j的使用和区别 对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于 ...
- webstorm设置babel,使用es6
原文链接:https://blog.csdn.net/peade/article/details/76522177 网上有很多关于如何设置babel的.我学习着设置,但总差那么几步,没能满足我的需求. ...
- HTTP之Cookie和Session
1. Cookie 1.1 为什么需要 Cookie? HTTP 协议是一种无状态的协议,也就是说,当前的 HTTP 请求与以前的 HTTP 请求没有任何联系.显然,这种无状态的情形在某些时候将让用户 ...
- linux 下安装redis并用QT写客户端程序进行连接
1.安装redis.使用如下命令: wget http://dowload.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd ...
- Linux | linux的那些常见目录
1. bin目录 binary(二进制的):许多"指令"对应的可"执行程序文件"目录 2. sbin目录 说明:super binary 超级的 二进制 许多& ...
- SmartTest__自动随机填充表单数据
下载地址https://addons.mozilla.org/zh-CN/firefox/addon/smarttesttool/ 安装完成后可以在工具栏看见 目前只包含两个功能 测试使用
- 转 layer的Icon样式以及一些常用的layer窗口使用
转载地址:http://blog.csdn.net/beauxie/article/details/60959971 本文搜集的是本人在实际开发中所用到的layer窗口,未用到的layer按钮,请参考 ...