传送门

题目要求割掉一条边后使得图不连通,那么可以使用tarjan算法求出所有的割边,然后把边双缩成点,就能得到一棵树,现在问题是在加入一条边的情况下,割掉最小的一条边使得图不连通,割掉的这条边权值最大是多少

加入的边如果是\((x,y)\),就可以使得链\((x,y)\)上所有边不被割,要最大化答案就要让比答案小的边都在一条链上,所以可以从小到大加入树边,如果加到某一时刻这些边不能在同一条链上那么也就能得到答案

我们可以维护加入边构成的链,可以利用求lca以及书上距离等方法维护,一些说明详见代码口胡警告

#include<bits/stdc++.h>
#define LL long long
#define db long double
#define il inline
#define re register
#define mkpr make_pairusing namespace std;
const int N=500000+10;
il int rd()
{int x=0,w=1;char ch=0;while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
int to[N<<1],nt[N<<1],w[N<<1],hd[N],tot=1;
void add(int x,int y,int z)
{++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;++tot,to[tot]=x,nt[tot]=hd[y],w[tot]=z,hd[y]=tot;
}
int n,m;
int dfn[N],low[N],ti,po[N];
int fa[N],sz[N],de[N],hs[N],top[N];
void dfs1(int x)
{sz[x]=1;for(int i=hd[x];i;i=nt[i]){int y=to[i];if(y==fa[x]) continue;fa[y]=x,de[y]=de[x]+1,dfs1(y),sz[x]+=sz[y];hs[x]=sz[hs[x]]>sz[y]?hs[x]:y;}
}
void dfs2(int x,int ntp)
{dfn[x]=++ti,top[x]=ntp;if(hs[x]) dfs2(hs[x],ntp);for(int i=hd[x];i;i=nt[i]){int y=to[i];if(y!=fa[x]&&y!=hs[x]) dfs2(y,y);}
}
int glca(int x,int y)
{while(top[x]!=top[y]){if(de[top[x]]<de[top[y]]) swap(x,y);x=fa[top[x]];}return de[x]<de[y]?x:y;
}
int gdis(int x,int y){return de[x]+de[y]-(de[glca(x,y)]<<1);}
bool brg[N];
void tj(int x,int ffa)
{dfn[x]=low[x]=++ti;for(int i=hd[x];i;i=nt[i]){if(i==ffa) continue;int y=to[i];if(!dfn[y]){tj(y,i^1),low[x]=min(low[x],low[y]);if(dfn[x]<low[y]) brg[i>>1]=1;}else low[x]=min(low[x],dfn[y]);}
}
int findf(int x){return po[x]==x?x:po[x]=findf(po[x]);}
struct edge
{int x,y,z;edge(){}edge(int nx,int ny,int nz){x=nx,y=ny,z=nz;if(de[x]>de[y]) swap(x,y);}bool operator < (const edge &bb) const {return z<bb.z;}
}e[N];int main()
{n=rd(),m=rd();for(int i=1;i<=m;++i){int x=rd(),y=rd(),z=rd();add(x,y,z);}tj(1,0);for(int i=1;i<=n;++i) po[i]=i;for(int i=1;i<=m;++i)if(!brg[i]) po[findf(to[i<<1])]=findf(to[i<<1|1]);memset(hd,0,sizeof(hd)),tot=1;for(int i=1;i<=m;++i)if(findf(to[i<<1])!=findf(to[i<<1|1])) add(findf(to[i<<1]),findf(to[i<<1|1]),w[i<<1]);m=tot>>1;ti=0,dfs1(findf(1)),dfs2(findf(1),findf(1));for(int i=1;i<=m;++i) e[i]=(edge){to[i<<1],to[i<<1|1],w[i<<1]};sort(e+1,e+m+1);int x=e[1].y,y=0,z=e[1].x; //x,y为链的两端点,z为链深度最浅的点for(int i=2;i<=m;++i){int xx=e[i].x,yy=e[i].y;    //分别表示加入边深度浅的点和深度深的点if(!y)  //链是直上直下的{if(dfn[yy]>=dfn[x]&&dfn[yy]<=dfn[x]+sz[x]-1) x=yy;  //新的下端点要在当前下端点子树内else if(glca(z,yy)==yy) z=xx;   //新的上端点要是当前上端点的祖先else{int p1=glca(x,xx),p2=glca(z,xx);if(p1!=p2) return printf("%d\n",e[i].z),0;  //加入的边从链的中间分岔出去,不合法if(gdis(x,xx)!=gdis(x,yy)+gdis(yy,xx)) y=yy,z=glca(x,y);   //从链顶分叉出去,形成一上一下的链}}else    //一上一下的链{if(dfn[yy]>=dfn[x]&&dfn[yy]<=dfn[x]+sz[x]-1) x=yy;else if(dfn[yy]>=dfn[y]&&dfn[yy]<=dfn[y]+sz[y]-1) y=yy;  //新的端点要在原端点的子树内else if(gdis(x,y)!=gdis(x,xx)+gdis(xx,y)||gdis(x,y)!=gdis(x,yy)+gdis(yy,y)) return printf("%d\n",e[i].z),0;    //如果某个点不在路径上就不合法}}puts("-1");return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/10462801.html

luogu P5234 [JSOI2012]越狱老虎桥相关推荐

  1. Luogu5234[JSOI2012]越狱老虎桥

    Luogu5234[JSOI2012]越狱老虎桥 题面:洛谷 解析 题意中的要求即为割掉权值最小的割边,所以先把图缩点(这里应该是边双连通分量),现在考虑增加一条边会对缩点后的树造成什么影响,无非是成 ...

  2. 【2017 4 12 总结】

    今天做JSOI2012的题. 才120,其实是可以拿很多部分分什么的,但是都打错... (代码实现能力太差了. 1. 4330: JSOI2012 爱之项链 Time Limit: 10 Sec  M ...

  3. 夸克某上万资源目录结构解析

    夸克网盘分享里面好多书保存不下来,无法检索,尝试按目录列出清单 import mathfrom requests_html import HTMLSession import urllib.reque ...

  4. P1007 独木桥(贪心,模拟)

    P1007 独木桥 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 已知桥的长度L,桥上有n个士兵和所在位置,求部队离开独木桥的最短时间和最长时间 #include <iost ...

  5. 越狱到底有多少别名(暴强!)

    搜集不易 让你开心了 就回个帖 先谢过~~~ <神奇史沟飞> <文身迷综><狐狸河的救赎><大光头有智慧> <小史快跑> <翻墙总动员 ...

  6. 坚果云同步linux,#坚果云每日小技巧分享# 你们要的“选择性同步”越狱啦!

    原标题:#坚果云每日小技巧分享# 你们要的"选择性同步"越狱啦! 自从坚果云同步盘推出云桥模式之后,选择性同步被我们的产品经理关进了大牢,这让我们很多选择性同步的用户感到不适应,并 ...

  7. 老虎地图是手机GPS地图吗,如何下载?

    手机GPS地图是手机GPS的重要组成部分,如果没有手机GPS地图,那么对于您的手机而言,仅仅说明您的手机配备了GPS模块,但无法使用GPS功能.如果手机支持GPS,那么装老虎地图就可以正常使用GPS功 ...

  8. 越狱Season 1-Episode 19: The Key

    Season 1, Episode 19: The Key -Kellerman: WeusedtohaveaGreatDane, Dane: 丹麦大狗 我们以前有一只大丹犬 bigandwild. ...

  9. xbox one 越狱_如何使用密码限制对Xbox One的访问

    xbox one 越狱 Whether you've got kids in the house and want to keep them off certain streaming program ...

最新文章

  1. 多角度人脸识别简单介绍
  2. 杭电2028--Lowest Common Multiple Plus
  3. Vue过渡 动画混入
  4. cmd cd 无法切换目录_一分钟掌握cmd基础操作,告别鼠标
  5. 求整数的位数及各位数字之和 (15 分)
  6. 情景喜剧消亡史:人人都爱,没人敢拍
  7. 请允许我用2019年11种主流编程语言,祝祖国70华诞快乐!
  8. ndk 编译 ffmpeg
  9. NodeJS Stream 三:readable
  10. LINUX SHELL使用变量控制循环
  11. oracle查看用户 同义词,oracle同义词
  12. 电脑重装系统之后MySQl如何恢复
  13. JUC种常用的辅助类
  14. win10打开计算机加载很慢,Win10系统打开“此电脑”很慢总是在加载不显示怎么办...
  15. 人月神话(二)外科手术队伍、贵族专制、民主政治和系统设计
  16. Mac 移动硬盘突然自己异常退出了(一)
  17. 恶意进程(云查杀)-DDOS木马
  18. 学习存储技术的5个阶段
  19. 如何搭建一个好的知识库管理系统?
  20. nw.js 使用记录 - 加载远程URL

热门文章

  1. Pr 入门教程之如何创建新序列?
  2. VMware15Pro 安装CentOS7
  3. 【论文阅读】水下机器人控制视觉伺服部分
  4. 解决 VS Code 卡顿 卡死 电脑变卡 CPU 运行高
  5. Grand Theft Auto V 图形研究(2)
  6. 腾讯云TVP专家眼中的云开发:尚不完美,未来可期
  7. Airtest双11领喵币代码
  8. AWVS11安装、操作
  9. 虚拟化操作系统ESXi 6.7安装配置详细步骤图文
  10. 全球混合现实产业引领者 孙立