好吧我太菜了又调了一晚上。。。QAQ


先跑出最小生成树,标记树边,再用树上倍增的思路,预处理出:

  f[u][i] :距离u为2^i的祖先

  h[u][i][0/1] :距u点在2^i范围内的最长边和次长边

然后枚举每一条非树边(u,v),会与原先的最小生成树构成一个环,而之前预处理出的数据可以快速找到(u,v)在最小生成树上的最大和次大边,来更新答案

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define int long long
#define R register int
using namespace std;
inline int g() {
R ret=,fix=;register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
struct node{int u,v,w;bool operator <(const node & y) const { return w<y.w;}}a[];
struct edge{int v,w,nxt;}e[];
int n,m,cnt,mx,mmx,mn=0x3f3f3f3f,ans,tot;
int fir[],f[][],h[][][],fa[],d[];
bool tr[];
inline void add(int u,int v,int w) {e[++cnt].v=v,e[cnt].nxt=fir[u],e[cnt].w=w,fir[u]=cnt;}
inline void ins(int u,int v,int w) {add(u,v,w),add(v,u,w);}
inline int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
inline void dfs(int u,int fa) {
for(R i=fir[u];i;i=e[i].nxt) {
R v=e[i].v; if(v==fa) continue;
f[v][]=u,h[v][][]=e[i].w,d[v]=d[u]+;
for(R i=;d[v]>=(<<i);++i) {
f[v][i]=f[f[v][i-]][i-];
h[v][i][]=max(h[v][i-][],h[f[v][i-]][i-][]);
if(h[v][i-][]==h[f[v][i-]][i-][])
h[v][i][]=max(h[v][i-][],h[f[v][i-]][i-][]);
else {
h[v][i][]=min(h[v][i-][],h[f[v][i-]][i-][]);
h[v][i][]=max(h[v][i-][],h[v][i][]);
h[v][i][]=max(h[v][i][],h[f[v][i-]][i-][]);
}
} dfs(v,u);
}
}
inline int lca(int u,int v) {
if(d[u]<d[v]) swap(u,v); R lim=log2(d[u])+;
for(R j=lim;j>=;--j) if(d[f[u][j]]>=d[v]) u=f[u][j];
if(u==v) return u;
for(R j=lim;j>=;--j) if(f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j];
return f[u][];
}
inline void calc(int u,int fa,int w) {
mx=,mmx=; R lim=log2(d[u]-d[fa])+;
for(R i=lim;i>=;--i) if(d[u]-d[fa]>=(<<i)){
if(h[u][i][]>mx) mmx=mx,mx=h[u][i][];
mx=max(h[u][i][],mx); mmx=max(mmx,h[u][i][]),u=f[u][i];
}
if(mx!=w) mn=min(mn,w-mx); else mn=min(mn,w-mmx);
}
signed main() {
n=g(),m=g();
for(R i=;i<=n;++i) fa[i]=i;
for(R i=;i<=m;++i) a[i].u=g(),a[i].v=g(),a[i].w=g();
sort(a+,a+m+);
for(R i=;i<=m&&tot<n;++i) {
R uf=getf(a[i].u),vf=getf(a[i].v);
if(uf==vf) continue;
fa[uf]=vf; ans+=a[i].w; tr[i]=true;
ins(a[i].u,a[i].v,a[i].w); ++tot;
} dfs(,);
for(R i=;i<=m;++i) if(!tr[i]) {
R L=lca(a[i].u,a[i].v);
calc(a[i].u,L,a[i].w); calc(a[i].v,L,a[i].w);
} printf("%lld\n",ans+mn);
}

2019.04.09

BZOJ 1977: [BeiJing2010组队]次小生成树 Tree 倍增 最小生成树的更多相关文章

  1. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  2. BZOJ 1977[BeiJing2010组队]次小生成树 Tree - 生成树

    描述: 就是求一个次小生成树的边权和 传送门 题解 我们先构造一个最小生成树, 把树上的边记录下来. 然后再枚举每条非树边(u, v, val),在树上找出u 到v 路径上的最小边$g_0$ 和 严格 ...

  3. 【刷题】BZOJ 1977 [BeiJing2010组队]次小生成树 Tree

    Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...

  4. bzoj 1977 [BeiJing2010组队]次小生成树 Tree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1977 kruscal别忘了先按边权sort.自己觉得那部分处理得还挺好的.(联想到之前某题的 ...

  5. 1977: [BeiJing2010组队]次小生成树 Tree

    1977: [BeiJing2010组队]次小生成树 Tree https://lydsy.com/JudgeOnline/problem.php?id=1977 题意: 求严格次小生成树,即边权和不 ...

  6. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  7. [BeiJing2010组队]次小生成树 Tree

    1977: [BeiJing2010组队]次小生成树 Tree Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 5168  Solved: 1668[S ...

  8. 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增

    [BZOJ1977][BeiJing2010组队]次小生成树 Tree Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C ...

  9. 【次小生成树】bzoj1977 [BeiJing2010组队]次小生成树 Tree

    Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...

随机推荐

  1. physoft.net网站暂停 www.physoft.cn 正式开通 (菲烁科技, physoft)

    physoft.net原本计划以开源代码为主体,由于各种原因代码未能开源.基于这些代码,physoft成立了 菲烁(重庆)科技有限公司 ( www.physoft.cn) ,专注于工业级双目视觉测量, ...

  2. 网络编程学习笔记-listen函数

    listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接 ...

  3. ***静态成员的定义及初始化 for c++ for新用法

    静态成员的初始化要在类外不然报错error: ISO C++ forbids in-class initialization of non-const static member '***' 但是声明 ...

  4. bzoj1177&p3625 [APIO2009]采油区域p[大力讨论]

    我好菜菜啊. 给定矩形,从中选出三个边长K的正方形互不重叠,使得覆盖到的数总和最大. 想的时候往dp上钻去了..结果一开始想了一个错的dp,像这样 /************************* ...

  5. 如何解决outlook2013邮件规则for other machine的失效问题

    如何解决outlook2013邮件规则for other machine的失效问题 问题描述:因为重装系统,outlook2013进去后->Rules and Alerts->发现所有原来 ...

  6. POJ3580:SuperMemo

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  7. 重学JAVA基础(二):Java反射

        看一下百度的解释:       JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息     ...

  8. 常见的post提交数据类型

    原文地址:https://www.cnblogs.com/yoyoketang/p/6771696.html 常见的post提交数据类型有四种: 1.第一种:application/json:这是最常 ...

  9. hibernate学习五 Hibernate补充

    1  MiddleGenIDE可以生成映射类和映射文件. 2

  10. 你所不知道的html5与html中的那些事(五)——web图像

    文章简介:       现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢?     下面看看今天我为大家带来了哪些关于we ...