博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 609E Minimum spanning tree for each edge
阅读量:6645 次
发布时间:2019-06-25

本文共 3024 字,大约阅读时间需要 10 分钟。

E. Minimum spanning tree for each edge
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
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.

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 test(s)
input
5 7 1 2 3 1 3 1 1 4 5 2 3 2 2 5 3 3 4 2 4 5 4
output
9 8 11 8 8 8 9

 

保证某条边e存在的MST就是普通Kruskal把e优先到了最前面。

先求一遍MST,如果e不再MST上,是因为形成了环,把环上除了e的最大权边去掉就好了。

(以前的LCA:用ST来RMQ,查询O(1)

(向祖先结点倍增其实和ST差不多,查询O(logn),维护信息灵活

(一开始想的是树剖,复杂度稍高

#include
using namespace std;typedef long long ll;const int N = 2e5+5, M = N*2;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 = 0; int i,j; for(i = 1; i <= m; i++) r[i] = i; cmp_c = we; sort(r+1, r + 1 + m, cmp_id); //ec = 0; for(i = 1; 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] = 0; } } return re;}const int LOG = 19;int fa[N][LOG], mx[N][LOG];int dep[N];void dfs(int u,int f = 0,int fw = 0,int d = 0){ fa[u][0] = f; mx[u][0] = 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+1); }}int lg;int queryMx(int u,int v){ int re = 0, i; if(dep[u] < dep[v]) swap(u,v); for(i = lg; i >= 0; i--) if(dep[u] - (1<
= dep[v]){ re = max(re,mx[u][i]); u = fa[u][i]; } if(u == v) return re; for(i = lg; i >= 0; 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][0],mx[v][0]));}//#define LOCALint main(){#ifdef LOCAL freopen("in.txt","r",stdin);#endif //cout<

 

转载于:https://www.cnblogs.com/jerryRey/p/5071528.html

你可能感兴趣的文章
修复电脑图片文件图标不显示的方法
查看>>
win 7 下分区的软件
查看>>
Oracle函数-单行函数-转换函数、条件表达式
查看>>
34补3-3 rhcs集群基础应用
查看>>
我的友情链接
查看>>
迅雷登录IFRAME需求小记
查看>>
用NuGet安装NewtonSoft.json
查看>>
域和域控制器
查看>>
Apache2.4 + MySQL5.5 + PHP5.5 FCGI方式运行
查看>>
Mac 上安装python3
查看>>
我眼中的OpenFlow
查看>>
走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串...
查看>>
Linux 内核配置选项
查看>>
一道算法面试题
查看>>
我的友情链接
查看>>
Bash中的变量类型
查看>>
基于VMWare Workstation 10的VMware ESXi5.5部署和配置
查看>>
[CCNA图文笔记]-3-TCP/IP参考模型和协议的对应关系
查看>>
学习linux—— 文件目录的管理
查看>>
信息安全比赛混淆flag脚本
查看>>