正题

P4180


题目大意

求严格次小生成树


解题思路

一定存在一种严格次小生成树,和最小生成树只差一条边,不然可以用一条最小生成树上的边代替,从而使边权和更小

那么可以先构造出最小生成树,然后枚举每一条不在最小生成树中的边,然后求最小生成树中路径上的最大值和严格次大值(因为可能相等,所以要求严格次大值),最后计算最小的替换代价


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100100
using namespace std;
ll n,m,x,y,mx1,mx2,ans,tot,num;
ll h[N],fa[N],dep[N],f[N][20],g[N][20][2];
struct rec
{ll to,nx,l;
}e[N<<1];
struct line
{ll x,y,z,p;
}l[N*3];
void add(ll x,ll y,ll z)
{e[++tot].to=y;e[tot].l=z;e[tot].nx=h[x];h[x]=tot;return;
}
bool cmp(line a,line b)
{return a.z<b.z;
}
ll find(ll x)
{return (fa[x]==x?x:fa[x]=find(fa[x]));
}
void get(ll &mx,ll &pmx,ll x)
{if(x>mx)pmx=mx,mx=x;else if(pmx<x&&x<mx)pmx=x;return;
}
void dfs(ll x)
{for(ll i=1;i<=16;++i){f[x][i]=f[f[x][i-1]][i-1];get(g[x][i][1],g[x][i][0],g[x][i-1][1]);get(g[x][i][1],g[x][i][0],g[x][i-1][0]);get(g[x][i][1],g[x][i][0],g[f[x][i-1]][i-1][1]);get(g[x][i][1],g[x][i][0],g[f[x][i-1]][i-1][0]);}for(ll i=h[x];i;i=e[i].nx){ll y=e[i].to;if(y==f[x][0])continue;dep[y]=dep[x]+1;f[y][0]=x;g[y][0][1]=e[i].l;dfs(y);}return;
}
void lca(ll &mx1,ll &mx2,ll x,ll y)
{if(dep[x]<dep[y])swap(x,y);for(ll i=16;i>=0;--i)if(dep[f[x][i]]>=dep[y]){get(mx1,mx2,g[x][i][1]);get(mx1,mx2,g[x][i][0]);x=f[x][i];}for(ll i=16;i>=0;--i)if(f[x][i]!=f[y][i]){get(mx1,mx2,g[x][i][1]);get(mx1,mx2,g[x][i][0]);get(mx1,mx2,g[y][i][1]);get(mx1,mx2,g[y][i][0]);x=f[x][i];y=f[y][i];}if(x!=y){get(mx1,mx2,g[x][0][1]);get(mx1,mx2,g[x][0][0]);get(mx1,mx2,g[y][0][1]);get(mx1,mx2,g[y][0][0]);}return;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=m;++i)scanf("%lld%lld%lld",&l[i].x,&l[i].y,&l[i].z);sort(l+1,l+1+m,cmp);for(ll i=1;i<=n;++i)fa[i]=i;for(ll i=1;i<=m;++i){x=find(l[i].x);y=find(l[i].y);if(x==y)continue;add(l[i].x,l[i].y,l[i].z);add(l[i].y,l[i].x,l[i].z);num+=l[i].z;fa[x]=y;l[i].p=1;}memset(g,-1,sizeof(g));f[1][0]=1;dep[1]=1;dfs(1);ans=1e15;for(ll i=1;i<=m;++i)if(!l[i].p){mx1=mx2=-1;lca(mx1,mx2,l[i].x,l[i].y);if(mx1>=0&&mx1<l[i].z)ans=min(ans,num-mx1+l[i].z);if(mx2>=0&&mx2<l[i].z)ans=min(ans,num-mx2+l[i].z);}printf("%lld",ans);return 0;
}

【kruskal】【倍增】严格次小生成树(P4180)相关推荐

  1. 解题报告:luogu P4180 [BJWC2010]严格次小生成树(次小生成树、倍增LCA优化、O(mlogn) )

    P4180 [BJWC2010]严格次小生成树 次小生成树有两种,一种是不严格次小生成树,也就是可以数值上等于最小生成树,一种是严格次小生成树,是权值严格大于最小生成树,两种求法大同小异. 方法2在严 ...

  2. BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)

    1977: [BeiJing2010组队] 次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MB Description 小 C 最近学了很多最小生成树 ...

  3. P4180-[BJWC2010]严格次小生成树【Kruskal,倍增】

    正题 题目链接:https://www.luogu.com.cn/problem/P4180 题目大意 nnn个点mmm条边的一张无向图,求它的严格次小生成树. 1≤n≤105,1≤m≤3×1051\ ...

  4. 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)

    整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...

  5. 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)

    整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...

  6. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

  7. 一棵树的生成树有几颗_次小生成树(树剖,生成树)

    生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...

  8. BZOJ1977: [BeiJing2010组队]次小生成树 Tree

    1977: [BeiJing2010组队]次小生成树 Tree 题意:求严格次小生成树 我为什么要单独发这篇呢 因为愚蠢的我不停换写法最后发现是因为没开long long所以wa掉的 很简单,次小生成 ...

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

    严格次小生成树.一开始没有特批一圈都相等的情况,一直WA,十分难受. 先生成最小生成树,枚举每条非树边,连上它构成一个环,拆掉环上树边中最大的一条(若和该边相等则次大的一条)换上这条. 用倍增维护一条 ...

最新文章

  1. Kalilinux安装openvas
  2. linux游戏欢迎界面,制作Linux登录欢迎界面
  3. java中函数的表达,如何表达“用T作为参数|的函数字符串,它是TypeScript中T“的键...
  4. matlab界area_Matlab的数据科学界
  5. Confluence 6 匿名用户
  6. 微软发布 Windows 命令行参考文档,涵盖超 250 项控制台命令
  7. flume-ng命令
  8. 在Linux下巧下载
  9. electronjs设置宽度_Js操作DOM元素及获取浏览器高宽的简单方法
  10. qt设置边框颜色_Qt开源作品14-导航按钮控件
  11. 行政管理专业考计算机研究生分数,行政管理学,考研,历年分数线是多少?
  12. vulhub Tomcat8漏洞复现
  13. 东南大学女孩子学计算机的多吗,2019年应届南邮上岸东南大学计算机生,经验分享,希望能帮助到迷茫的你...
  14. coreldraw的线条怎么变成圆头_CDR将照片变线条的三种方法
  15. 怎样创建一个计算机用户,如何创建域用户账户
  16. 血液透析机最全学习手册
  17. Intellij Error:java: Compilation failed: internal java compiler error
  18. 记录,在公网云服务器,装入redis服务后,未设置密码直接被pnscan病毒攻击,变成wakuang机器。
  19. 初识ElasticSearch(2) -文档查询之match查询 | 分词器
  20. 计算机电路板 接地,pcb电路板接地怎么接

热门文章

  1. py2exe for python3_使用Py2Exe for Python3创建自己的exe程序
  2. 昆明学院计算机二级报名时间,2017年3月昆明学院计算机等级考试报名时间(云南)...
  3. linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动
  4. c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...
  5. c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】
  6. 杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...
  7. java 判断object类型_Java 类继承机制
  8. accdb原有的数据怎么清除_VBA中利用数组对数据批量处理的方法
  9. c++STL的反向迭代器
  10. linux正向连接shell_[经验] Linux 怎么连接 Xshell?