CF# Educational Codeforces Round 3 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
题意:给出一个图,问每一条边如果要在一个生成树当中,那这个生成树最小是多少。
分析:先找出一个最小生成树。
想像一下,加入一条边,会对这个生成树造成什么影响。
形成了一个环,然后最优情况,肯定要拿掉除他之外最大的一条边。
问题就变成了,在最小生成树上查询两点之间的边的最大值。
/**
Create By yzx - stupidboy
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
typedef long long LL;
typedef double DB;
#define MIT (2147483647)
#define INF (1000000001)
#define MLL (1000000000000000001LL)
#define sz(x) ((int) (x).size())
#define clr(x, y) memset(x, y, sizeof(x))
#define puf push_front
#define pub push_back
#define pof pop_front
#define pob pop_back
#define mk make_pair inline int Getint()
{
int Ret = ;
char Ch = ' ';
bool Flag = ;
while(!(Ch >= '' && Ch <= ''))
{
if(Ch == '-') Flag ^= ;
Ch = getchar();
}
while(Ch >= '' && Ch <= '')
{
Ret = Ret * + Ch - '';
Ch = getchar();
}
return Flag ? -Ret : Ret;
} const int N = , M = ;
int n, m;
struct EdgeType
{
int u, v, value, index;
LL ans;
inline bool operator <(const EdgeType &t) const
{
return value < t.value;
} inline void Read()
{
u = Getint();
v = Getint();
value = Getint();
}
} edge[N];
int fa[N], favalue[N];
int first[N], to[N * ], value[N * ], next[N * ], tot;
int up[N][M], depth[N], maxcnt[N][M];
LL ans; inline void Input()
{
n = Getint();
m = Getint();
for(int i = ; i <= m; i++)
{
edge[i].Read();
edge[i].index = i;
}
} inline int Find(int x)
{
static int path[N], len;
for(len = ; x != fa[x]; x = fa[x])
path[++len] = x;
for(int i = ; i <= len; i++) fa[path[i]] = x;
return x;
} inline void Insert(int u, int v, int val)
{
tot++;
to[tot] = v, value[tot] = val, next[tot] = first[u];
first[u] = tot;
} inline void Bfs()
{
static int que[N], head, tail;
for(int i = ; i <= n; i++) fa[i] = -;
que[] = , head = tail = , fa[] = , depth[] = ;
while(head <= tail)
{
int u = que[head++];
for(int tab = first[u], v; tab; tab = next[tab])
if(fa[v = to[tab]] == -)
{
fa[v] = u, favalue[v] = value[tab], depth[v] = depth[u] + ;
que[++tail] = v;
}
}
} inline int GetMax(int u, int v)
{
int ret = , level = M;
while(depth[u] != depth[v])
{
if(depth[u] < depth[v]) swap(u, v);
while(level && ( << level) > depth[u] - depth[v]) level--;
ret = max(ret, maxcnt[u][level]);
u = up[u][level];
}
level = M;
while(level && u != v)
{
while(level && ( << level) > depth[u]) level--;
while(level && up[u][level] == up[v][level]) level--;
ret = max(ret, maxcnt[u][level]);
ret = max(ret, maxcnt[v][level]);
u = up[u][level], v = up[v][level];
}
while(u != v)
{
ret = max(ret, favalue[u]);
ret = max(ret, favalue[v]);
u = fa[u], v = fa[v];
}
return ret;
} inline bool CompareByIndex(const EdgeType &a, const EdgeType &b)
{
return a.index < b.index;
} inline void Solve()
{
sort(edge + , edge + + m);
for(int i = ; i <= n; i++) fa[i] = i;
for(int i = ; i <= m; i++)
{
int u = Find(edge[i].u), v = Find(edge[i].v);
if(u != v)
{
Insert(edge[i].u, edge[i].v, edge[i].value);
Insert(edge[i].v, edge[i].u, edge[i].value);
ans += edge[i].value;
fa[u] = v;
}
} Bfs(); for(int i = ; i < M; i++)
{
if(( << i) > n) break;
for(int j = ; j <= n; j++)
if(i == )
{
up[j][i] = fa[j];
maxcnt[j][i] = favalue[j];
}
else
{
up[j][i] = up[up[j][i - ]][i - ];
maxcnt[j][i] = max(maxcnt[j][i - ], maxcnt[up[j][i - ]][i - ]);
}
} for(int i = ; i <= m; i++)
{
int u = edge[i].u, v = edge[i].v;
int ret = GetMax(u, v);
edge[i].ans = ans - ret + edge[i].value;
} sort(edge + , edge + + m, CompareByIndex);
for(int i = ; i <= m; i++) printf("%I64d\n", edge[i].ans);
} int main()
{
freopen("a.in", "r", stdin);
Input();
Solve();
return ;
}
CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge的更多相关文章
- CF Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树变种
题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...
- 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 ...
- 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 (最小生成树+树链剖分)
题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...
- [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 ...
- Codeforces Edu3 E. Minimum spanning tree for each edge
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
随机推荐
- iOS工程师Mac上的必备软件
原文链接 前言 iOS工程师一直都是那么的高逼格,用的是Mac电脑,耍的是iPhone手机,哇咔咔~~ 但是,作为一名iOS开发工程师,我们除了高逼格外,还必须是全能的.你不会点UI设计 ...
- 再来一发!DB2 应用程序如何从数据库取数据 Fetch
The FETCH statement positions a cursor on the next row of its result table and assigns the values of ...
- php数组的创建及操作
//数组的创建 //1 $usernames = array('李彦宏','周宏伟','马云','俞敏洪','李开复'); echo $usernames; //array,打印类型 echo '&l ...
- ReactNative环境配置
参考链接 Windows系统安装React Native环境 windows下React Native Android 环境搭建 在Windows下搭建React Native Android开发环境 ...
- IT人学习方法论(二):学习误区
之前我们讨论了“学什么”的问题,今天我们来谈一谈“怎么学”的问题.磨刀不误砍柴工,我们要提高学习效率,首先需要找到自己学习方法上的误区. 一些常见的学习方法误区 1)资料导向型 现在就停止阅读这篇文章 ...
- loadrunner支持https协议的操作方法-经验总结
问题:用户portal支持https协议,用loadrunner录制登陆脚本时发现未录制到用户名和密码 录制到的脚本如下: login() { lr_think_time(10); web_url(& ...
- jQuery - 9.Ajax
9.1 Ajax 的 XMLHttpRequest 对象 9.2 JQuery中的Ajax 9.2.1 load()方法 9.2.2 $.get() 9.2.3 $.post() 9.2.4 $.ge ...
- Android请求服务器的两种方式--post, get的区别
android中用get和post方式向服务器提交请求_疯狂之桥_新浪博客http://blog.sina.com.cn/s/blog_a46817ff01017yxt.html Android提交数 ...
- Bootstrap简介
接下来的一段时间,想研究一下现有的网页框架,第一个不容错过的就是Bootstrap,Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CS ...
- 【网络资料】如何优雅地使用Sublime Text3
如何优雅地使用Sublime Text3 Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相 ...