题目描述

原题来自:BeiJing 2010 组队赛

给定一张 N 个点 M 条边的无向图,求无向图的严格次小生成树。

设最小生成树的边权之和为 sum,严格次小生成树就是指边权之和大于 sum 的生成树中最小的一个。

输入格式

第一行包含两个整数 N 和 M,表示无向图的点数与边数;

接下来 M 行,每行三个数 x,y,z表示点 x和点 y 之间有一条边,边的权值为 z。

输出格式

包含一行,仅一个数,表示严格次小生成树的边权和。

数据保证必定存在严格次小生成树。

样例

样例输入

5 6
1 2 1
1 3 2
2 4 3
3 5 4
3 4 3
4 5 6

样例输出

11
#include<bits/stdc++.h>
const int MAXN=,MAXM=;
using namespace std;
int n,m,N;
struct E{
int u,v,f;
long long val;
}a[MAXM*];
bool mw(E a,E b)
{
return a.val<b.val;
}
struct Edge{
int to,next;
long long val;
}edge[MAXM*];
int head[MAXN],num=;
int fa[MAXN],find();
long long ans,mn=;
int f[MAXN][],dep[MAXN];
long long d1[MAXN][],d2[MAXN][];
inline void add(int u,int v,long long val)
{
edge[++num].next=head[u];
edge[num].to=v;
edge[num].val=val;
head[u]=num;
return;
}
inline int find(int a)
{
return a==fa[a]?a:fa[a]=find(fa[a]);
}
inline void grow()
{
int u,v,val,cnt=;
sort(a+,a+m+,mw);
int r1,r2;
for(register int i=;i<=n;++i)fa[i]=i;
for(register int i=;i<=m;++i)
{
u=a[i].u,v=a[i].v,val=a[i].val;
r1=find(u);
r2=find(v);
if(r1!=r2)
{
cnt++;
a[i].f=;
add(u,v,val);
add(v,u,val);
fa[r1]=r2;
ans+=val;
if(cnt==n-) break;
}
}
return;
}
inline void dfs(int u)
{
for(register int i=;i<=N;i++)
{
f[u][i]=f[f[u][i-]][i-];
d1[u][i]=max(d1[u][i-],d1[f[u][i-]][i-]);
if(d1[u][i-]==d1[f[u][i-]][i-])
d2[u][i]=max(d2[u][i-],d2[f[u][i-]][i-]);
else
{
d2[u][i]=min(d1[u][i-],d1[f[u][i-]][i-]);
d2[u][i]=max(d2[u][i-],d2[u][i]);
d2[u][i]=max(d2[u][i],d2[f[u][i-]][i-]);
}
}
for(register int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==f[u][])continue;
f[v][]=u;
d1[v][]=edge[i].val;
dep[v]=dep[u]+;
dfs(v);
}
return;
}
inline int lca(int a,int b)
{
if(dep[a]>dep[b]) swap(a,b);
for(register int i=N;i>=;i--)
{
if(dep[a]<dep[b]&&dep[f[b][i]]>=dep[a]) b=f[b][i];
}
if(a==b)return a;
for(register int i=N;i>=;i--)
{
if(f[a][i]!=f[b][i]){a=f[a][i],b=f[b][i];}
}
return f[a][];
}
inline void Try(int u,int father,long long val)
{
int t;
t=dep[u]-dep[father];
long long mx1=-,mx2=;
for(int i=;i<=N;i++)
{
if(t&(<<i))//注意这一步!!
{
if(mx1<=d1[u][i])
{
mx2=mx1;
mx1=d1[u][i];
mx2=max(mx2,d2[u][i]);
}
else
{
mx2=max(mx2,d1[u][i]);
}
u=f[u][i];//写的好神奇
}
}
if(mx1!=val)
{
if(mn>val-mx1)
{
mn=val-mx1;
}
}
else
{
if(mn>val-mx2)
{
mn=val-mx2;
}
}
return;
}
inline void choose()
{
int f,u,v,val;
for(register int i=;i<=m;++i)
{
if(a[i].f==)
continue;
u=a[i].u;
v=a[i].v;
val=a[i].val;
f=lca(u,v);
Try(u,f,val),Try(v,f,val);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(register int i=;i<=m;++i)
{
scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].val);
}
grow();
N=floor(log(n+0.0)/log(2.0));
dfs();
choose();
printf("%lld",ans+mn);
return ;
}

次小生成树(lca)的更多相关文章

  1. 次小生成树(LCA倍增)

    算法: 求出MST之后枚举每条在MST之外的边 连上之后会出现环 找到环中除加上的边之外权值最大的边 删除该边之后得到一颗新树 做法: 利用LCA倍增地维护最小生成树上两点之间的最大边权 每次枚举在M ...

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

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

  3. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

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

  4. 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)

    洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...

  5. [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca

    Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...

  6. 「LuoguP4180」 【模板】严格次小生成树[BJWC2010](倍增 LCA Kruscal

    题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得 ...

  7. 严格次小生成树(lca + 倍增)

    题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得 ...

  8. 树的问题小结(最小生成树、次小生成树、最小树形图、LCA、最小支配集、最小点覆盖、最大独立集)

    树的定义:连通无回路的无向图是一棵树. 有关树的问题: 1.最小生成树. 2.次小生成树. 3.有向图的最小树形图. 4.LCA(树上两点的最近公共祖先). 5.树的最小支配集.最小点覆盖.最大独立集 ...

  9. [BJWC2010]严格次小生成树(LCA,最小生成树)

    [BJWC2010]严格次小生成树 题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图 ...

随机推荐

  1. [IISNode] 如何在IIS7/8下,配置一个可以通过IIS访问NodeJS的web项目

    参考了一下几篇很给力的文章,在每篇文章中,都学到了解决遇到的问题的答案: (1)用iisnode模块,让你的Node.js应用跑在Windows系统IIS中 (2)让IIS能够运行Nodejs (3) ...

  2. Openresty 健康检查

    ## 指定共享内存 lua_shared_dict healthcheck 1m; ## 在worker初始化过程中,启动定时器,进行后端结点的检查 init_worker_by_lua_block ...

  3. TCP/IP学习笔记1--概述,分组交换协议

    1.TCP/IP 互联网是由许多独立发展的网络通信技术融合而成的,能够使它们不断融合并实现统一的正式TCP/IP技术,TCP/IP使通信协议的统称. TCP/IP协议模型(Transmission C ...

  4. flink checkpoint状态储存三种方式选择

    Flink 提供了三种可用的状态后端:MemoryStateBackend,FsStateBackend,和RocksDBStateBackend. MemoryStateBackend Memory ...

  5. Python入门 常量 注释 基础数据类型 用户输入 流程控制

    Python入门 一.常量 在Python中,不像其他语言有绝对的常量,修改会报错,在Python中有个约定俗成的规定--常量就是将变量名大写. 尽量保持不更改的一种量 , 这个常量有是干什么的呢 其 ...

  6. Locust性能测试_参数关联

    前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点, 需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:htt ...

  7. CapsLock Enhancement via AutoHotKey

    上次写了一篇博文,讲如何通过AutoHotKey改造CaspLock,使其成为一个方便的编辑按键,并特意给出了设计的思路方便参考. 见地址:http://www.cnblogs.com/Vonng/p ...

  8. Harbor配置自签名证书,docker login+web https访问,helm chart推送应用

    注:高版本(14以上)docker执行login命令,默认使用https,且harbor必须使用域名,只是用ip访问是不行的. 假设使用的网址是:www.harbor.mobi,本机ip是192.16 ...

  9. texlive2019安装

    TeX Live 是 TUG (TeX User Group) 发布并维护的的 TeX 系统,可以称得上是TeX的官方系统,官网为:https://www.tug.org/texlive/ 1.通过最 ...

  10. C# vb .net实现博物馆哑色框架特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的博物馆哑色框架效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授 ...