cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)
先kruskal求出一个最小生成树,然后对于每条非树边(a,b),从树上找a到b路径上最大的边,来把它替换掉,就是包含这条边的最小生成树
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=2e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b,l,ne;
}eg[maxn*],eg0[maxn];
int egh[maxn],ect;
int N,M;
int fa[maxn],f[maxn][],ma[maxn][],dep[maxn];
ll ans[maxn]; inline void adeg(int a,int b,int c){
eg[++ect].b=b;eg[ect].l=c;eg[ect].ne=egh[a];egh[a]=ect;
} inline bool cmp(Edge a,Edge b){return a.l<b.l;}
int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);} void dfs(int x){
for(int i=;f[x][i]&&f[f[x][i]][i];i++){
f[x][i+]=f[f[x][i]][i];
ma[x][i+]=max(ma[x][i],ma[f[x][i]][i]);
}
for(int i=egh[x];i;i=eg[i].ne){
int b=eg[i].b;
if(b==f[x][]) continue;
dep[b]=dep[x]+;
f[b][]=x;ma[b][]=eg[i].l;
dfs(b);
}
} ll get(int x,int y){
int re=;
if(dep[x]<dep[y]) swap(x,y);
for(int i=log2(dep[x]-dep[y]);i>=&&dep[x]!=dep[y];i--){
if(dep[f[x][i]]>=dep[y])
re=max(re,ma[x][i]),x=f[x][i];
}
if(x==y) return re;
for(int i=log2(dep[x]);i>=;i--){
if(f[x][i]!=f[y][i])
re=max(re,max(ma[y][i],ma[x][i])),x=f[x][i],y=f[y][i];
}
return max(re,max(ma[y][],ma[x][]));
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
eg0[i].a=rd(),eg0[i].b=rd(),eg0[i].l=rd();
eg0[i].ne=i;
}sort(eg0+,eg0+M+,cmp);
ll dis=;
for(i=;i<=N;i++) fa[i]=i;
for(i=,j=;i<=M&&j<N-;i++){
int aa=getf(eg0[i].a),bb=getf(eg0[i].b);
if(aa!=bb){
adeg(eg0[i].a,eg0[i].b,eg0[i].l);
adeg(eg0[i].b,eg0[i].a,eg0[i].l);
dis+=eg0[i].l;
fa[aa]=bb;j++;
}
}
dep[]=;dfs();
for(i=;i<=M;i++){
ans[eg0[i].ne]=dis+eg0[i].l-get(eg0[i].a,eg0[i].b);
}
for(i=;i<=M;i++){
printf("%I64d\n",ans[i]);
}
return ;
}
cf609E Minimum Spanning Tree For Each Edge (kruskal+倍增Lca)的更多相关文章
- Minimum spanning tree for each edge(倍增LCA)
https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...
- CF609E Minimum spanning tree for each edge
原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...
- [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. 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 ...
随机推荐
- Python高阶函数--map
map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把list 的每个元素依次作用在函数 f 上,得到一个新的 list 并返回. 例如,对于lis ...
- KVM虚拟机管理——虚拟机克隆
1. 概述2. 部署基本操作系统虚拟机3. 配置虚拟机3.1 修改/etc/sysconfig/network3.2 删除/etc/sysconfig/network-scripts/ifcfg-et ...
- Session之Config配置
<sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" ...
- Haproxy和Nginx负载均衡测试效果对比记录
为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...
- php类之clone 克隆
对象也能被“克隆” 在php5中,对象的传递方式默认为引用传递,如果我们想要在内存中生成两个一样的对象或者创建一个对象的副本,这时可以使用“克隆”. 通过 clone 克隆一个对象 对象的复制是通过关 ...
- leetcode: 638.大礼包
题目描述: https://leetcode-cn.com/problems/shopping-offers/ 解题思路: 这类求最大最小的问题首先想到的就是用DP求解. 这题还用到了递归,首先计算单 ...
- Machine Learning Based Proactive Flow Entry Deletion for OpenFlow
来源:IEEE 2018 作者:Hemin Yang and George F.Riley 摘要: 流表容量有限,因此高效管理流表至关重要.本文重点讨论了OpenFlow中定义的一种流表管理机制,即能 ...
- How to leave the open file in eclipse tab after search?
https://superuser.com/questions/130353/how-to-leave-the-open-file-in-eclipse-tab-after-search From m ...
- 变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
HP 4411s Install Red Hat Enterprise Linux 5.8) pick up from http://blog.chinaunix.net/uid-423637-id- ...
- Oracle 数据表误删恢复 Flashback
1. 前提条件. recyclebin 参数打开. 验证参数是否打开: SHOW PARAMETER RECYCLEBIN 2. 如果参数没有打开的话 需要打开,并且重启一下数据库方法为 alter ...