正题

题目链接:https://www.luogu.com.cn/problem/P4180


题目大意

\(n\)个点\(m\)条边的一张无向图,求它的严格次小生成树。

\(1\leq n\leq 10^5,1\leq m\leq 3\times 10^5\)


解题思路

一定存在一种严格次小生成树和最小生成树只差一条边,感性理解的话大概就是如果有两条不同那么肯定有一条可以替换成另一条要么更优要么不变。

所以我们可以枚举一条不选的边\((u,v,w)\)然后找到最小生成树上\(u,v\)路径最大的权值\(k\)替换。

但是发现有可能恰好\(w=k\),所以我们不只需要统计最大的权值,还要统计一个严格次大的,如果等于就选择严格次大的。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,T=18;
struct enode{
ll x,y,w,v;
}e[3*N];
struct node{
ll to,next,w;
}a[N<<1];
ll n,m,tot,ls[N],fa[N],dep[N];
ll ans,sum,f[N][T],g[N][T][2];
bool cmp(enode x,enode y)
{return x.w<y.w;}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void addl(ll x,ll y,ll w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
void dfs(ll x,ll fa){
dep[x]=dep[fa]+1;
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(y==fa)continue;
f[y][0]=x;g[y][0][0]=a[i].w;
dfs(y,x);
}
return;
}
void calc(ll &mx,ll &mi,ll x){
if(x>mx)mi=mx,mx=x;
else if(x>mi&&x!=mx)mi=x;
return;
}
void calccc(ll x,ll y,ll w){
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
ll mx=-1,mi=-1;
for(ll i=T-1;i>=0;i--)
if(dep[f[y][i]]>=dep[x]){
calc(mx,mi,g[y][i][0]);
calc(mx,mi,g[y][i][1]);
y=f[y][i];
}
if(x!=y){
for(ll i=T-1;i>=0;i--)
if(f[x][i]!=f[y][i]){
calc(mx,mi,g[x][i][0]);
calc(mx,mi,g[x][i][1]);
calc(mx,mi,g[y][i][0]);
calc(mx,mi,g[y][i][1]);
x=f[x][i];y=f[y][i];
}
calc(mx,mi,g[x][0][0]);
calc(mx,mi,g[x][0][1]);
calc(mx,mi,g[y][0][0]);
calc(mx,mi,g[y][0][1]);
}
if(w!=mx)ans=min(ans,sum+w-mx);
else if(mi>=0)ans=min(ans,sum+w-mi);
return;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++)
scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].w);
sort(e+1,e+1+m,cmp);
for(ll i=1;i<=n;i++)fa[i]=i;
for(ll i=1;i<=m;i++){
ll x=find(e[i].x),y=find(e[i].y);
if(x==y)continue;
addl(e[i].x,e[i].y,e[i].w);
addl(e[i].y,e[i].x,e[i].w);
fa[x]=y;e[i].v=1;sum+=e[i].w;
}
memset(g,-1,sizeof(g));
dfs(1,1);
for(ll j=1;j<T;j++)
for(ll i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
calc(g[i][j][0],g[i][j][1],g[i][j-1][0]);
calc(g[i][j][0],g[i][j][1],g[i][j-1][1]);
calc(g[i][j][0],g[i][j][1],g[f[i][j-1]][j-1][0]);
calc(g[i][j][0],g[i][j][1],g[f[i][j-1]][j-1][1]);
}
ans=1e18;
for(ll i=1;i<=m;i++)
if(!e[i].v)calccc(e[i].x,e[i].y,e[i].w);
printf("%lld\n",ans);
return 0;
}

P4180-[BJWC2010]严格次小生成树【Kruskal,倍增】的更多相关文章

  1. P4180 [BJWC2010]严格次小生成树

    P4180 [BJWC2010]严格次小生成树 P4180 题意 求出一个无向联通图的严格次小生成树.严格次小生成树的定义为边权和大于最小生成树的边权和但不存在另一棵生成树的边权和在最小生成树和严格次 ...

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

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

  3. POJ 1679 The Unique MST:次小生成树【倍增】

    题目链接:http://poj.org/problem?id=1679 题意: 给你一个图,问你这个图的最小生成树是否唯一. 题解: 求这个图的最小生成树和次小生成树.如果相等,则说明不唯一. 次小生 ...

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

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

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

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

  6. 洛谷 P4180 【模板】严格次小生成树[BJWC2010]【次小生成树】

    严格次小生成树模板 算法流程: 先用克鲁斯卡尔求最小生成树,然后给这个最小生成树树剖一下,维护边权转点权,维护最大值和严格次大值. 然后枚举没有被选入最小生成树的边,在最小生成树上查一下这条边的两端点 ...

  7. 【洛谷P4180】严格次小生成树

    题目大意:给定一个 N 个顶点,M 条边的带权无向图,求该无向图的一个严格次小生成树. 引理:有至少一个严格次小生成树,和最小生成树之间只有一条边的差异. 题解: 通过引理可以想到一个暴力,即:先求出 ...

  8. [BJWC2010] 严格次小生成树

    [BJWC2010]严格次小生成树算法及模板 所谓次小生成树,即边权之和第二小的生成树,但所谓严格,就是不能和最小的那个相等. 求解严格次小生成树的方法一般有倍增和LCT两种.当然LCT那么高级的我当 ...

  9. 【bzoj1977】【严格次小生成树】倍增维护链上最大次大值

    (上不了p站我要死了,侵权度娘背锅) Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C ...

  10. UVA10462Is There A Second Way Left? —— 次小生成树 kruskal算法

    题目链接:https://vjudge.net/problem/UVA-10462 Nasa, being the most talented programmer of his time, can’ ...

随机推荐

  1. Synchronized和ReentranLock的区别

    1.底层实现上来说? Synchronized是JVM层面的锁,是Java关键字,通过monitor对象来完成. ReentranLock是API层面的锁底层使用AQS. 2.是否可手动释放锁? sy ...

  2. 是的你没看错,HTTP3来了

    目录 简介 HTTP成长介绍 不同HTTP协议解决的问题 HTTP3和QUIC TLS1.3 解决HoL阻塞 连接的迁移 总结 简介 很多小伙伴可能还沉浸在HTTP1.1的世界无法自拔,但是时代的洪流 ...

  3. ASP.NET Core教程:ASP.NET Core中使用Redis缓存

    参考网址:https://www.cnblogs.com/dotnet261010/p/12033624.html 一.前言 我们这里以StackExchange.Redis为例,讲解如何在ASP.N ...

  4. C++ 子类调用父类的方法,静态方法的调用

    #include <iostream> class  A { public: A(); ~ A(); virtualvoid say() { std::cout << &quo ...

  5. 腾讯云 TKE Everywhere 特性发布,用户可在自有基础设施中托管 K8s 服务

    作者 孔令飞,腾讯云资深工程师,拥有大规模 Kubernetes 集群.微服务的研发和架构经验,目前专注于云原生混合云领域的基础架构开发. 朱翔,腾讯云容器服务高级产品经理,目前负责云原生混合云产品方 ...

  6. Tomcat集群Cluster实现原理

    1.Tomcat集群         Tomcat集群的问题之一是如何处理Session,Session是有状态的,请求到了Tomcat,后续流传是要根据上下文(Context)来进行的.我们可以改造 ...

  7. 一次PHP大马提权

    记一次PHP提权 发现 PHP大马:指木马病毒:PHP大马,就是PHP写的提取站点权限的程序:因为带有提权或者修改站点功能,所以称为叫木马. 自从师哥那里听说过之后,一直感叹于PHP大马的神奇...但 ...

  8. JDBC分页查询及实现

    当数据过多时,一页之内是无法显示的,因此需要进行分页显示. (一)分页技术实现: 物理分页: - 在数据库执行查询时(实现分页查询),查询需要的数据--依赖数据库的SQL语句 - 在sql查询时,从数 ...

  9. 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕

    Maven底层容器Plexus Container的前世今生,一代芳华终落幕 前言 说实话,我非常地纠结,大家平时只是用Maven,对于内部的实现其实也不关心,我现在非要拉着大家给大家讲.这就有个问题 ...

  10. CSS002. 字体穿透蒙层(用img设置字体的color)

    之前在逛Apple Store时看到了下面的UI: 交互图标非常圆滑上手也很舒服,虽然背景底色本就是白底,但是只依赖css能不能使  "+" 穿透背景看到底色 ? 大致思路如下: ...