Description

这里,是美丽的南京;这里,是秀美的进香河;这里是安逸的老虎桥。 
如果说进香河的美,美在其秀美的风光,倒不如说是美在了那惬意的南京古典小巷式生活。如果说进香河的迷人,在其淳朴的民风,倒不如说是那被历史掩埋了的秘密吸引着人们好奇的心。 
也许很多人都还记得,老虎桥监狱,北洋时期江南最大的监狱,在近一个世纪中,面对满清、北洋、民国、新中国几朝兴衰,名称屡次更替,沧桑尽显其中。 
现在的人们,恐怕很难相信,到底有多少惊心动魄的事情曾经就在这里上演。 
那是1948年的冬天,南京地下组织的一支小分队决定偷袭老虎桥监狱,救出被困的数百名人员。那时的老虎桥监狱,被N层电网围了起来,由内而外,依次编号为1,2,…,N。第1层电网接有高压电。有M条高压线,连接了所有电网,其中第i条高压线连接了第ai和bi层电网,如果要破坏第i条高压线,需要至少动用Ti位特工。面对这么多层电网,偷袭小分队犯愁了。至少需要破坏一层电网,否则是无法偷袭成功的。 
然而,狡猾的间谍却知道了这件事情,为了破坏偷袭计划,敌人秘密地又增加了一条高压线,不让偷袭小分队的成员发现。 
为了能够偷袭成功,不论新增的这一条秘密高压线是连接哪两层电网的,小分队都必须要破坏且仅破坏一条高压线,使得至少有一层电网不通电。注意,对于新增的高压线,我们并不知道需要多少位特工才能成功破坏。现在的问题是,偷袭小分队至少需要多少名特工呢? 
决战就在今夜! 

Input

第一行有2个整数,N和M,分别表示电网层数和高压线个数。 
之后M行,每行3个整数,分别是ai, bi和Ti。 

Output

输出只有一行,包含一个整数,表示最少需要动用的特工人数。 
如果计划必然失败,则输出 -1。 
边双联通分量内的边删了不影响联通情况,所以先缩点,留下割边,问题转化为在树上选一条路径,使未被覆盖的边的最小值最大,可以直接树形dp
#include<cstdio>
#define G *++ptr
const int N=,inf=0x3f3f3f3f;
char buf[N*],*ptr=buf-;
int _(){
int x=,c=G;
while(c<)c=G;
while(c>)x=x*+c-,c=G;
return x;
}
bool ei[N*];
int n,m,es[N*],enx[N*],ev[N*],e0[N],e1[N],ep=,id[N],idp;
void ae(int*e,int a,int b,int c){
es[ep]=b;enx[ep]=e[a];ev[ep]=c;e[a]=ep++;
es[ep]=a;enx[ep]=e[b];ev[ep]=c;e[b]=ep++;
}
int dfn[N],low[N],tk=;
void mins(int&a,int b){if(a>b)a=b;}
void maxs(int&a,int b){if(a<b)a=b;}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void tj(int w){
dfn[w]=low[w]=++tk;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(!u)continue;
if(!dfn[u]){
es[i^]=;
tj(u);
es[i^]=w;
mins(low[w],low[u]);
if(low[u]>dfn[w])ei[i>>]=;
}else mins(low[w],dfn[u]);
}
}
void f1(int w){
id[w]=idp;
dfn[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(!ei[i>>]&&dfn[u])f1(u);
}
}
int v0[N],v02[N],v1[N],v2[N],vu[N],v,ans=;
void f2(int w,int pa){
v0[w]=v02[w]=v1[w]=v2[w]=vu[w]=inf;
for(int i=e1[w];i;i=enx[i]){
int u=es[i];
if(u==pa)continue;
f2(u,w);
v=min(v0[u],ev[i]);
v2[w]=max(min(v2[w],v),min(v1[w],v1[u]));
v1[w]=max(min(v1[w],v),min(v0[w],v1[u]));
if(v<=v0[w])v02[w]=v0[w],v0[w]=v;
else mins(v02[w],v);
}
}
void f3(int w,int pa){
v=min(vu[w],v2[w]);
maxs(ans,v);
for(int i=e1[w];i;i=enx[i]){
int u=es[i];
if(u==pa)continue;
vu[u]=min(min(ev[i],vu[w]),min(v0[u],ev[i])==v0[w]?v02[w]:v0[w]);
f3(u,w);
}
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
n=_();m=_();
for(int i=,a,b,c;i<m;++i){
a=_();b=_();c=_();
if(a==b)continue;
ae(e0,a,b,c);
}
tj();for(int i=;i<=n;++i)if(dfn[i]){
++idp;
f1(i);
}
for(int i=;i<ep;i+=)if(ei[i>>])ae(e1,id[es[i]],id[es[i^]],ev[i]);
f2(,);
f3(,);
if(ans==inf)ans=-;
printf("%d",ans);
return ;
}

bzoj4331: JSOI2012 越狱老虎桥的更多相关文章

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

    [BZOJ4331][JSOI2012]越狱老虎桥(Tarjan) 题面 BZOJ 然而BZOJ是权限题QwQ 洛谷 题解 先求出所有割边,那么显然要割掉一条割边. 如果要加入一条边,那么显然是把若干 ...

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

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

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

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

  4. bzoj AC倒序

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

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

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

  6. [Swust OJ 567]--老虎在不在笼子里(凸包问题)

    题目链接:http://acm.swust.edu.cn/problem/567/ Time limit(ms): 1000 Memory limit(kb): 65535   一只老虎自从看了< ...

  7. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  8. 【转】 iOS9.2-iOS9.3.3越狱插件清单

    以下是iOS9.3.3越狱插件清单 原文地址:http://bbs.feng.com/read-htm-tid-10668605.html 序列 支持与否 插件名称 兼容版本 支持设备 1 是 20 ...

  9. hub,桥,交换机,路由器的区别

    1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...

随机推荐

  1. poj_3071 Football(概率dp)

    直接上状态转移方程: 记dp[i][j]为第i轮比赛,第j个队伍获胜的概率. 那么初始状态下,dp[0][j]=1://也就是第0轮比赛全都获胜 d[i][j]=sum(d[i-1][j]*d[i-1 ...

  2. UVa 11732 strcmp()函数(左孩子右兄弟表示法)

    #include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...

  3. VS2012 QT程序打包部署详解

    1.设置安装程序集 InstallShield安装完成后,执行以下步骤右键解决方案-->添加-->新建项目-->其他项目类型-->安装和部署,具体操作如下图: 2.发布程序 在 ...

  4. BZOJ 3529 【SDOI2014】 数表

    题目链接:数表 我们一起来膜PoPoQQQ大爷的题解吧Orz 首先我们来考虑没有\(a\)的限制该怎么做.显然交换\(n\),\(m\)答案不变,所以后面默认\(n \le m\). 我们定义两个函数 ...

  5. C++ 中的关于输出的设置于

    ▲setw(n)用法: 通俗地讲就是预设宽度 如 cout<<setw(5)<<255<<endl; 结果是: (空格)(空格)255 ▲setfill(char ...

  6. 将 R 整合到 markdown 中

    markdown 易于写入和读取,具有编写报告的必要功能,例如简单的文本格式,嵌入图片.链接.表.引用.数学公式以及代码块.虽然在 markdown 中编写纯文本很容易,但是创建具有许多图片和表格的报 ...

  7. AndroidStudio怎样导入library项目开源库

    AndroidStudio是一款非常强大的android程序开发软件,在里面集成了几乎所有android开发中需要使用的工具,编译.运行.打包.开发.调试等功能一应俱全,可以使用起来非常方便. 今天要 ...

  8. jackson springboot null节点忽略配置

    spring: jackson: date-format: yyyy-MM-dd HH:mm:ss default-property-inclusion: non_null spring.jackso ...

  9. 多线程--Thread.join方法

    在Thread类的Api中,Join的作用是让当前线程等待目标线程结束之后才继续执行. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.  比如在线程B ...

  10. OMAP4之DSP核(Tesla)软件开发学习(四)ARM核与DSP核通讯示例

    首先,安卓系统完全启动4AJ.2.1. 其次,查看OMAP4的Tesla相关信息,检查Tesla是否使能.(有如下显示,则OK) cat /d/emoteproc/omap-rproc.0/versi ...