【kruskal】【倍增】严格次小生成树(P4180)
正题
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)相关推荐
- 解题报告:luogu P4180 [BJWC2010]严格次小生成树(次小生成树、倍增LCA优化、O(mlogn) )
P4180 [BJWC2010]严格次小生成树 次小生成树有两种,一种是不严格次小生成树,也就是可以数值上等于最小生成树,一种是严格次小生成树,是权值严格大于最小生成树,两种求法大同小异. 方法2在严 ...
- BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
1977: [BeiJing2010组队] 次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MB Description 小 C 最近学了很多最小生成树 ...
- P4180-[BJWC2010]严格次小生成树【Kruskal,倍增】
正题 题目链接:https://www.luogu.com.cn/problem/P4180 题目大意 nnn个点mmm条边的一张无向图,求它的严格次小生成树. 1≤n≤105,1≤m≤3×1051\ ...
- 模板 - LCA最近公共祖先(倍增法、Tarjan、树上差分、LCA优化的次小生成树)
整理的算法模板合集: ACM模板 注意x和y的LCA可以是x或者y本身 一.LCA的在线倍增算法 /*给定一棵包含 n个节点的有根无向树,有 m个询问,每个询问 给出了一对节点的编号 x和 y,询问 ...
- 最小生成树(kruskal、prim、最小生成森林问题、严格次小生成树)
整理的算法模板合集: ACM模板 目录 一.kruskal算法 二.prim算法 三.Boruvka算法 四.生成森林问题(K颗树) 五.最小生成树的唯一性 六.严格次小生成树 LCA优化的次小生成树 ...
- `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树
Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...
- 一棵树的生成树有几颗_次小生成树(树剖,生成树)
生成树的概念: 在一个无向图中,设顶点数为\(n\),取其中\(n-1\)条边并使所有点相连,所得到的一棵树即为生成树. 最小生成树: 如果还没有接触过生成树的同学,欢迎戳->最小生成树详解 次 ...
- BZOJ1977: [BeiJing2010组队]次小生成树 Tree
1977: [BeiJing2010组队]次小生成树 Tree 题意:求严格次小生成树 我为什么要单独发这篇呢 因为愚蠢的我不停换写法最后发现是因为没开long long所以wa掉的 很简单,次小生成 ...
- BZOJ 1977 [BeiJing2010组队]次小生成树 Tree
严格次小生成树.一开始没有特批一圈都相等的情况,一直WA,十分难受. 先生成最小生成树,枚举每条非树边,连上它构成一个环,拆掉环上树边中最大的一条(若和该边相等则次大的一条)换上这条. 用倍增维护一条 ...
最新文章
- Kalilinux安装openvas
- linux游戏欢迎界面,制作Linux登录欢迎界面
- java中函数的表达,如何表达“用T作为参数|的函数字符串,它是TypeScript中T“的键...
- matlab界area_Matlab的数据科学界
- Confluence 6 匿名用户
- 微软发布 Windows 命令行参考文档,涵盖超 250 项控制台命令
- flume-ng命令
- 在Linux下巧下载
- electronjs设置宽度_Js操作DOM元素及获取浏览器高宽的简单方法
- qt设置边框颜色_Qt开源作品14-导航按钮控件
- 行政管理专业考计算机研究生分数,行政管理学,考研,历年分数线是多少?
- vulhub Tomcat8漏洞复现
- 东南大学女孩子学计算机的多吗,2019年应届南邮上岸东南大学计算机生,经验分享,希望能帮助到迷茫的你...
- coreldraw的线条怎么变成圆头_CDR将照片变线条的三种方法
- 怎样创建一个计算机用户,如何创建域用户账户
- 血液透析机最全学习手册
- Intellij Error:java: Compilation failed: internal java compiler error
- 记录,在公网云服务器,装入redis服务后,未设置密码直接被pnscan病毒攻击,变成wakuang机器。
- 初识ElasticSearch(2) -文档查询之match查询 | 分词器
- 计算机电路板 接地,pcb电路板接地怎么接
热门文章
- py2exe for python3_使用Py2Exe for Python3创建自己的exe程序
- 昆明学院计算机二级报名时间,2017年3月昆明学院计算机等级考试报名时间(云南)...
- linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动
- c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...
- c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】
- 杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...
- java 判断object类型_Java 类继承机制
- accdb原有的数据怎么清除_VBA中利用数组对数据批量处理的方法
- c++STL的反向迭代器
- linux正向连接shell_[经验] Linux 怎么连接 Xshell?