P4180 【模板】严格次小生成树[BJWC2010]

倍增(LCA+最小生成树

施工队挖断学校光缆导致断网1天(大雾)

考虑直接枚举不在最小生成树上的边。但是边权可能与最小生成树上的边相等,这样删边时权值不改变,就不满足条件了

所以我们可以先用倍增处理出最小生成树上任意2点之间的最大边权和次大边权

枚举每条不在最小生成树上的边,接到树上,再删去最大边(与枚举边的边权不等)或次大边(最大边与枚举边的边权相等),做个判断

判断边(u,v)时 我们只要询问(u,lca)和(v,lca)就可以了

找了半个多小时才发现数组不够大....

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
template <typename T> inline T max(T &a,T &b) {return a>b ?a:b;}
template <typename T> inline T min(T &a,T &b) {return a<b ?a:b;}
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
struct edge{int from,to,dis;}a[];
int n,m,cnt,f[],hd[],nxt[],ed[],poi[],val[]; //邻接表存边
bool vis[];
inline bool cmp(const edge &A,const edge &B) {return A.dis<B.dis;}
inline int find(int x) {return f[x]==x ? x:f[x]=find(f[x]);}
inline void add(int x,int y,int v){
nxt[ed[x]]=++cnt; hd[x]=hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y; val[cnt]=v;
} struct LCA{
int d[],fa[][],fir[][],sec[][]; //fir:最大值 sec:次大值
inline void dfs(int x,int _fa){ //dfs预处理
d[x]=d[_fa]+; fa[x][]=_fa;
for(int i=;(<<i)<=d[x];++i){
fa[x][i]=fa[fa[x][i-]][i-];
fir[x][i]=max(fir[x][i-],fir[fa[x][i-]][i-]);
if(fir[x][i]!=fir[fa[x][i-]][i-]) sec[x][i]=max(sec[x][i],fir[fa[x][i-]][i-]); //次大值
else if(fir[x][i]!=fir[x][i-]) sec[x][i]=max(sec[x][i],fir[x][i-]);
}
for(int i=hd[x];i;i=nxt[i])
if(poi[i]!=_fa){
fir[poi[i]][]=val[i];
sec[poi[i]][]=-1e9-;
dfs(poi[i],x);
}
}
inline int lca(int x,int y){ //最近公共祖先
if(d[x]<d[y]) swap(x,y);
for(int i=;i>=;--i)
if(d[x]-(<<i)>=d[y])
x=fa[x][i];
if(x==y) return x;
for(int i=;i>=;--i)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][];
}
inline int query(int x,int y,int k){ //询问(x,y)之间的最大值
int res=-1e9-;
for(int i=;i>=;--i)
if(d[fa[x][i]]>=d[y]){
if(fir[x][i]!=k) res=max(res,fir[x][i]);
else res=max(res,sec[x][i]);
x=fa[x][i];
}
return res;
}
}mo1;
int main(){
read(n); read(m);
for(int i=;i<=n;++i) f[i]=i;
for(int i=;i<=m;++i) read(a[i].from),read(a[i].to),read(a[i].dis);
sort(a+,a+m+,cmp); int k=; long long tot=,ans=1e16;
for(int i=;i<=m&&k<n-;++i){
int r1=find(a[i].from),r2=find(a[i].to);
if(r1!=r2){
tot+=a[i].dis; f[r1]=r2; vis[i]=; ++k;
add(a[i].from,a[i].to,a[i].dis);
add(a[i].to,a[i].from,a[i].dis);
}
}mo1.dfs(,);
for(int i=;i<=m;++i){
if(vis[i]) continue; //在最小生成树上
int _lca=mo1.lca(a[i].from,a[i].to);
int q1=mo1.query(a[i].from,_lca,a[i].dis); //询问(u,lca)
int q2=mo1.query(a[i].to,_lca,a[i].dis); //询问(v,lca)
ans=min(ans,tot-max(q1,q2)+(long long)a[i].dis); //换边找最小值
}printf("%lld",ans);
return ;
}

P4180 【模板】严格次小生成树[BJWC2010]的更多相关文章

  1. Luogu P4180 【模板】严格次小生成树[BJWC2010]

    P4180 [模板]严格次小生成树[BJWC2010] 题意 题目描述 小\(C\)最近学了很多最小生成树的算法,\(Prim\)算法.\(Kurskal\)算法.消圈算法等等.正当小\(C\)洋洋得 ...

  2. 【洛谷】4180:【模板】严格次小生成树[BJWC2010]【链剖】【线段树维护最大、严格次大值】

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

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

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

  4. 【luogu P4180 严格次小生成树[BJWC2010]】 模板

    题目链接:https://www.luogu.org/problemnew/show/P4180 这个题卡树剖.记得开O2. 这个题inf要到1e18. 定理:次小生成树和最小生成树差距只有在一条边上 ...

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

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

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

    题目链接 题意如题. 这题作为我们KS图论的T4,我直接打了个很暴力的暴力,骗了20分.. 当然,我们KS里的数据范围远不及这题. 这题我debug了整整一个晚上还没debug出来,第二天早上眼前一亮 ...

  7. P4180 严格次小生成树[BJWC2010] Kruskal,倍增

    题目链接\(Click\) \(Here\). 题意就是要求一个图的严格次小生成树.以前被题面吓到了没敢做,写了一下发现并不难. 既然要考虑次小我们就先考虑最小.可以感性理解到一定有一种次小生成树,可 ...

  8. 【【模板】严格次小生成树[BJWC2010]】

    树上的路径怎么能没有树剖 显然,次小生成树和最小生成树只在一条边上有差距,于是我们就可以枚举这一条边,将所有边加入最小生成树,之后再来从这些并不是那么小的生成树中找到那个最小的 我们往最小生成树里加入 ...

  9. 「BJWC2010」模板严格次小生成树

    题目描述 小 \(C\) 最近学了很多最小生成树的算法,\(Prim\) 算法.\(Kruskal\) 算法.消圈算法等等.正当小\(C\)洋洋得意之时,小\(P\)又来泼小\(C\)冷水了.小\(P ...

随机推荐

  1. openstack 部署(Q版)-----glance镜像服务安装配置

    一.创建数据库 CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO '; GRANT ALL PRIVILEGES ON glanc ...

  2. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  3. python的笔记

    np.argsort(x):返回数据x从小到大的索引值,记住是一个索引值.当你想获取从小到大的数据的时候,用到这个 data[::-1]:对数据data进行倒转 a=[0,1,2,3,4,5] a[: ...

  4. django中admin的使用

    转载网址:https://www.cnblogs.com/wumingxiaoyao/p/6928297.html     Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理 ...

  5. PL/SQL类的应用

    类的定义 直接声明字段类型‘VARCHAR2或NUMBER等’ declare type kingsql_tp1 is record(empno number,ename varchar2(100)) ...

  6. 分块学习笔记qwq

    我没想到居然就学到分块了...哇我还一直觉得分块听起来挺牛逼的一直想学的来着qwq(其实之前好像vjudge上有道题是用分块做的?等下放链接qwq 所以想着就写个学习笔记趴qwq 首先知道分块的时间复 ...

  7. 洛谷P5021 赛道修建 NOIp2018 贪心+二分答案

    正解:贪心+LCA+二分答案 解题报告: 想先港下部分分qwq因为我部分分只拿到了10ptsQAQ(时间不够不是理由,其实还是太弱,所以要想很久,所以才时间不够QAQ m=1 找直径长度,完 一条链 ...

  8. 几种常见web攻击手段及其防御方式

    XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 XSS 概念 全称是跨站脚本攻击(Cross ...

  9. 【编码备份】1.9从Excel中导入用户名进行测试,用户一次进入系统进行答题测试。

    # coding=utf-8 """ Created on 2017年7月31日 @author: candy """ from selen ...

  10. Innodb引擎状态查看

    我们的MySQL数据库内的表一般都是Innodb表类型的. mysql>show engine  innodb status; (低版本用: show innodb status;)   === ...