luogu P5234 [JSOI2012]越狱老虎桥
题目要求割掉一条边后使得图不连通,那么可以使用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_pair
using 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;
}
luogu P5234 [JSOI2012]越狱老虎桥的更多相关文章
- 【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)
[BZOJ4331][JSOI2012]越狱老虎桥(Tarjan) 题面 BZOJ 然而BZOJ是权限题QwQ 洛谷 题解 先求出所有割边,那么显然要割掉一条割边. 如果要加入一条边,那么显然是把若干 ...
- bzoj4331: JSOI2012 越狱老虎桥
Description 这里,是美丽的南京:这里,是秀美的进香河:这里是安逸的老虎桥. 如果说进香河的美,美在其秀美的风光,倒不如说是美在了那惬意的南京古典小巷式生活.如果说进香河的迷人,在其淳朴的 ...
- 洛谷P5234 越狱老虎桥 [JSOI2012] tarjan
正解:tarjan+贪心(?并不会总结是什么方法QAQ,,, 解题报告: 传送门! 这题是真的题意杀,,,我我我要不是之前知道题目大意了我怕是怎么看都看不懂这是个什么意思昂QAQ 所以先说下题目大意好 ...
- luogu P3197 [HNOI2008]越狱
构造长度为n的串,给定m种颜色,求使得相邻两位的颜色相同的方案数 显然可以看出长度为n的串染m种颜色的总方案数为$m^{n}$ 然后来考虑相邻两位颜色不同的方案 对于第一位,有m种选择 对于剩余的n- ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- luogu题解 P2860[USACO冗余路径Redundant Paths] 缩点+桥
题目链接 https://www.luogu.org/problemnew/show/P2860 https://www.lydsy.com/JudgeOnline/problem.php?id=17 ...
- 越狱Season 1-Episode 19: The Key
Season 1, Episode 19: The Key -Kellerman: WeusedtohaveaGreatDane, Dane: 丹麦大狗 我们以前有一只大丹犬 bigandwild. ...
- [Swust OJ 567]--老虎在不在笼子里(凸包问题)
题目链接:http://acm.swust.edu.cn/problem/567/ Time limit(ms): 1000 Memory limit(kb): 65535 一只老虎自从看了< ...
- [BZOJ4071][APIO2015]八邻旁之桥
BZOJ(这题是BZOJ权限题,有权限号的就去看看吧) Luogu(良心洛谷) 题目描述 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域\(A\)和区域\(B\). 每一块区域沿着河岸都建了恰好 ...
随机推荐
- 使用Docker for Windows初体验
https://www.baidu.com/link?url=61Kwadwh6h__2Vmjf7lAKVo1RjhsULAqERcMXYnYzkLKrRVpygwBJVnjultH8zbq& ...
- OpenLayers学习笔记(三)— QML与HTML通信之 地图上点击添加自由文本
实现在地图随意点击,弹出文本输入框,输入任意文字,完成自由文本添加的功能 作者: 狐狸家的鱼 GitHub:八至 本文链接:地图上点击添加自由文本 关于如何QML与HTML通信已经在上一篇文章 QML ...
- bzoj1398 Necklace
关于最小表示法的模板题. 最小表示法:把一个字符串表示为它的的所有循环同构字符串中的字典序最小者. 直接参见代码中的函数getmin()获取精髓 #include <cstdio> #in ...
- 将本地html文件拖到IE8浏览器无法打开,直接弹出一个下载的对话框
查看一下注册表[HKEY_CLASSES_ROOT\.htm]和[HKEY_CLASSES_ROOT\.html]的ContentType值是否都为“text/html”
- 第一个java程序的编译
import java.io.*; public class EmployeeTest{ public static void main(String args[]){ /* 使用构造器创建两个对象 ...
- PHP的简单工厂模式
又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建 ...
- maven编译或者打包web项目显示“软件包 javax.servlet.http 不存在"
2.解决办法: 这是由于缺少servlet-api.jar包,其实tomcat下有,但是在java build path把他加载过来,还是报这个错误,所以我们直接在pom.xml里面加入这个jar包即 ...
- bzoj1040 基环树森林dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1040 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社 ...
- 使用mutt自动发送邮件
1.Mutt安装及环境配置 1.1.安装 sudo yum install mutt 比如你要设置邮件的发信人,需要做: sudo vim /etc/Muttrc set envelope_from= ...
- Java基础构造方法和this关键字整理
构造方法 8.1构造方法介绍 构造方法的格式: 修饰符 构造方法名(参数列表) { } l 构造方法的体现: n 构造方法没有返回值类型.也不需要写返回值.因为它是为构建对象的,对象创建完,方法就 ...