先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)的更多相关文章

  1. Minimum spanning tree for each edge(倍增LCA)

    https://vjudge.net/contest/320992#problem/J 暑期训练的题. 题意:给你一个n个点,m条边的无向图.对于每一条边,求包括该边的最小生成树. 思路:首先想到求一 ...

  2. CF609E Minimum spanning tree for each edge

    原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...

  3. [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]

    这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

  2. Mysqldump备份说明及数据库备份脚本分享-运维笔记

    MySQLdump是MySQL自带的导出数据工具,即mysql数据库中备份工具,用于将MySQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中.Mysqldump是一个客户端逻辑备份的工 ...

  3. combox的基本应用

    easyui-combox:控件的初始化: 可以在其中进行文字的筛选功能(过滤), 动态加载数据的方法. <!DOCTYPE html><html lang="en&quo ...

  4. 读书笔记(chapter3)

    进程管理 3.1进程 1.进程:进程就是处于执行期的程序,实际上,进程就是正在执行的程序代码的实时结果: 2.执行线程,简称线程,是进程中活动的对象(每个线程拥有独立的程序计数器.进程栈.和一组进程寄 ...

  5. SqlDataAdapter简单介绍 (转)

    From:  http://blog.sobnb.com/u/92/5532.html 一.特点介绍 1.表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连 ...

  6. spatial-temporal information extraction典型方法总结

    ==================================== 咳咳咳 由于科研的直接对象就是video sequence,所以,如何更好地提取spatial-temporal inform ...

  7. shell脚本--函数

    shell的函数和Javacript和php的函数声明一样,只不过shell在调用函数的时候,只需要写函数名就可以调用函数,注意不要在函数名后面加括号 创建并使用函数 #!/bin/bash #文件名 ...

  8. From CORBA technology To Thrift technology

    技术在变,需求不变,把复杂的事情搞简单,而不是相反. 无论CORBA还是Thrift,目标只有一个:一处定义,多处使用,解决的问题只有一个:规范和简化客户端与服务器的通信的开发工作. 是不是和java ...

  9. $().click()和$(document).on('click','要选择的元素',function(){})的不同

    1. $(选择器).click(fn) 当选中的选择器被点击时触发回调函数fn.只针对与页面已存在的选择器; 2.$(document).on('click','要选择的元素',function(){ ...

  10. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...