博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
阅读量:6520 次
发布时间:2019-06-24

本文共 1770 字,大约阅读时间需要 5 分钟。

构建完MST后,枚举非树边(u,v,w),在树上u->v的路径中找一条权值最大的边(权为maxn),替换掉它

这样在 w=maxn 时显然不能满足严格次小。但是这个w可以替换掉树上严格小于maxn的次大边
用倍增维护MST上路径的最大值、次大值,每条非树边的查询复杂度就为O(logn)

ps:1.倍增更新次大值时,未必是从最大值转移,要先赋值较大的次大值,再与较小的那个最大值比较。

2.maxn!=w时,是可以从maxn更新的(不能更新就是上面情况啊)
倍增处理部分我还是在dfs里写吧 md改了一晚上

//648ms 31.61MB#include 
#include
#include
//#define gc() getchar() #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++) typedef long long LL; const int N=1e5+5,M=3e5+5,D=18,MAXIN=2e6; int n,m,F[N],Enum,H[N],to[N<<1],nxt[N<<1],val[N<<1],dep[N],fa[N][D],maxn[N][D],s_maxn[N][D]; bool ist[M]; char IN[MAXIN],*SS=IN,*TT=IN; struct Edge { int fr,to,val; bool operator <(const Edge &a)const{ return val
maxn[x][i-1]) s_maxn[x][i]=std::max(s_maxn[x][i],maxn[x][i-1]); else if(maxn[fa[x][i-1]][i-1]
maxn[x][i-1]) // s_maxn[x][i]=std::max(s_maxn[x][i],maxn[x][i-1]); // else if(maxn[fa[x][i-1]][i-1]
=0; --i) if(dep[fa[u][i]]>=dep[lca]) { if(maxn[u][i]!=w) res=std::max(res,maxn[u][i]); else res=std::max(res,s_maxn[u][i]); u=fa[u][i]; } return res; } int LCA(int u,int v) { if(dep[u]
=0; --i) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i]; // if(t&(1<
=0; --i) if(fa[u][i]!=fa[v][i]) u=fa[u][i], v=fa[v][i]; return fa[u][0]; } int main() { n=read(),m=read(); for(int i=1; i<=m; ++i) e[i].fr=read(),e[i].to=read(),e[i].val=read(); LL tot=Kruskal(),res=e[m].val+tot; dep[1]=1, pre_DFS(1);//, Init(); for(int u,v,w,lmax,rmax,i=1; i<=m; ++i) if(!ist[i]) { u=e[i].fr, v=e[i].to, w=LCA(u,v); lmax=Query(u,w,e[i].val), rmax=Query(v,w,e[i].val); res=std::min(res,tot+e[i].val-std::max(lmax,rmax)); } printf("%lld",res); return 0; }

 

转载于:https://www.cnblogs.com/qb666/p/8486266.html

你可能感兴趣的文章
Master-work模式
查看>>
dos命令行 指令
查看>>
RT-Thread--时间管理
查看>>
BUPT 63T 高才生 找最佳基站
查看>>
linux 学习(二)防火墙
查看>>
scala001
查看>>
【实习记】2014-08-20实习的mini项目总结
查看>>
android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替...
查看>>
自己选择的路,跪着走完吧——一个兔纸的话
查看>>
zabbix-3.2.3+php-5.6.29+percona-server-5.6.29-76.2+nginx-1.10.2(CentOS6.8)
查看>>
三端稳压器各个参数解释
查看>>
算法(Algorithms)第4版 练习 1.3.14
查看>>
mysql 自动化脚本备份
查看>>
virtual PC 打造IE6、IE7、IE8、IE9等多版本共存原版测试环境
查看>>
js面向对象1
查看>>
[] ubuntu 14.04 搜狗拼音输入法安装
查看>>
内部类
查看>>
高速数论变换(NTT)
查看>>
Springmvc的跳转方式
查看>>
加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
查看>>