【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)

题面

BZOJ

然而BZOJ是权限题QwQ

洛谷

题解

先求出所有割边,那么显然要割掉一条割边。

如果要加入一条边,那么显然是把若干条割边串起来,使得这些割边不能被割掉。

那么把割边求出来之后,按照权值从小到大考虑所有割边,第一个不能和前面的构成一条链的割边就是答案。

那么考虑能否构成一条链。

首先缩点后形成一棵树,然后维护链的开头、链的结尾,以及链上深度最浅的位置,然后大力讨论一波就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 500500
#define ll long long
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<2];
int h[MAX],cnt=2,U[MAX<<1],V[MAX<<1],w[MAX<<1];
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dfn[MAX],low[MAX],tim;bool ins[MAX],cut[MAX<<1];
int S[MAX],top,G[MAX],gr;
void Tarjan(int u,int ff)
{
dfn[u]=low[u]=++tim;S[++top]=u;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
if(!dfn[v])
{
Tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else low[u]=min(low[u],dfn[v]);
if(low[v]>dfn[u])cut[i>>1]=true;
}
if(dfn[u]==low[u])
{
++gr;int v;
do{v=S[top--];G[v]=gr;}while(u!=v);
}
}
int fa[MAX],dep[MAX],tp[MAX],hson[MAX],size[MAX];
void dfs1(int u,int ff)
{
fa[u]=ff;dep[u]=dep[ff]+1;size[u]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs1(v,u);size[u]+=size[v];
if(size[v]>size[hson[u]])hson[u]=v;
}
}
void dfs2(int u,int t)
{
tp[u]=t;if(hson[u])dfs2(hson[u],t);
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=fa[u]&&e[i].v!=hson[u])
dfs2(e[i].v,e[i].v);
}
int LCA(int u,int v)
{
while(tp[u]^tp[v])dep[tp[u]]<dep[tp[v]]?v=fa[tp[v]]:u=fa[tp[u]];
return dep[u]<dep[v]?u:v;
}
int n,m,p[MAX],tot;
bool cmp(int a,int b){return w[a]<w[b];}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
U[i]=read(),V[i]=read(),w[i]=read(),Add(U[i],V[i]),Add(V[i],U[i]);
Tarjan(1,0);
for(int i=2;i<cnt;i+=2)if(cut[i>>1])p[++tot]=i>>1;
sort(&p[1],&p[tot+1],cmp);
memset(h,0,sizeof(h));cnt=1;
for(int i=1;i<=m;++i)U[i]=G[U[i]],V[i]=G[V[i]];
for(int i=1;i<=m;++i)if(U[i]!=V[i])Add(U[i],V[i]),Add(V[i],U[i]);
dfs1(1,0);dfs2(1,1);
int H=U[p[1]],T=V[p[1]],M=0;
if(dep[H]<dep[T])swap(H,T);
for(int i=2;i<=tot;++i)
{
int u=U[p[i]],v=V[p[i]];if(dep[u]<dep[v])swap(u,v);
int a=LCA(u,H),b=LCA(v,H),c=LCA(u,T),d=LCA(v,T);
if(!M)
{
if(a==u&&b==v&&c==T&&d==T)continue;
if(a==H&&b==H){H=u;continue;}
if(c==u&&d==v){T=v;continue;}
if(c==d&&dep[c]<=dep[T]){T=u;M=v;continue;}
printf("%d\n",w[p[i]]);return 0;
}
else
{
if(a==H&&b==H){H=u;continue;}
if(c==T&&d==T){T=u;continue;}
if(a==u&&b==v&&c==M&&d==M)continue;
if(a==M&&b==M&&c==u&&d==v)continue;
printf("%d\n",w[p[i]]);return 0;
}
}
puts("-1");
return 0;
}

【BZOJ4331】[JSOI2012]越狱老虎桥(Tarjan)的更多相关文章

  1. bzoj4331: JSOI2012 越狱老虎桥

    Description 这里,是美丽的南京:这里,是秀美的进香河:这里是安逸的老虎桥.  如果说进香河的美,美在其秀美的风光,倒不如说是美在了那惬意的南京古典小巷式生活.如果说进香河的迷人,在其淳朴的 ...

  2. luogu P5234 [JSOI2012]越狱老虎桥

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

  3. 洛谷P5234 越狱老虎桥 [JSOI2012] tarjan

    正解:tarjan+贪心(?并不会总结是什么方法QAQ,,, 解题报告: 传送门! 这题是真的题意杀,,,我我我要不是之前知道题目大意了我怕是怎么看都看不懂这是个什么意思昂QAQ 所以先说下题目大意好 ...

  4. 割点和桥---Tarjan算法

    使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况:         (1)该节点是根节点,且有两棵以上的子树;         (2)该节 ...

  5. 在无向图中找最短桥(tarjan)

    题目:hdu 4738 题目意思:  曹操有N个岛,这些岛用M座桥连接起来 每座桥有士兵把守(也可能没有) 周瑜想让这N个岛不连通,但只能炸掉一座桥 并且炸掉一座桥需要派出不小于守桥士兵数的人去 解题 ...

  6. 无向图的割点和桥 tarjan 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 20005; const int MAXM = 100005; ...

  7. 模板 - 强连通分量/割点/桥 - Tarjan

    int dfn[N], low[N], dfncnt, s[N], tp; int scc[N], sc; // 结点 i 所在 scc 的编号 int sz[N]; // 强连通 i 的大小 voi ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

随机推荐

  1. iOS保持App真后台运行

    https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...

  2. 学习yii2.0——依赖注入

    依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...

  3. Laravel 服务容器、服务提供器、契约实例讲解

        前言 刚开始看laravel服务容器.契约.服务提供器的确生涩难懂,不单单是概念繁多,而且实际的demo很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道, ...

  4. java 工厂模式 转载

    下面介绍三种设计模式,简单工厂模式,工厂方法模式,抽象工厂模式 思考如下场景: 有一天,林同学准备去买笔记本,他到商城发现有两款电脑他特别喜欢, 一款是 Macbook Pro, 另一款是 Surfa ...

  5. Linux(CentOS7)命令学习摘要

    1. 修改机器名 hostnamectl set-hostname newname 2. hosts主机存放位置 /etc/hosts 3. 安装tigervncserver, 然后使用vncserv ...

  6. PhpStorm本地断点调试

    一.断点调试php环境搭建 1.检测本地php环境是否安装了Xdebug 在本地输出phpinfo():搜索Xdebug;如下图  如果没有安装,安装操作Xdebug如下: 将phpinfo();的信 ...

  7. zabbix添加监控Mysql

    起因:zabbix自带的mysql监控模板直接使用会显示“不支持的”因为key的值是通过Mysql用户查看"show global status"信息或者用mysqladmin命令 ...

  8. Oracle minus用法详解及应用实例

    本文转载:https://blog.csdn.net/jhon_03/article/details/78321937 Oracle minus用法 “minus”直接翻译为中文是“减”的意思,在Or ...

  9. 避免MQ消息重发的简单实现思路

    一.MQ消息发送 一.MQ消息发送 1.发送端MQ-client(消息生产者:Producer)将消息发送给MQ-server: 2.MQ-server将消息落地: 3.MQ-server回ACK给M ...

  10. 学习 Spring (十一) 注解之 Spring 对 JSR 支持

    Spring入门篇 学习笔记 @Resource Spring 还支持使用 JSR-250 中的 @Resource 注解的变量或 setter 方法 @Resource 有一个 name 属性,并且 ...