HDU 4005 The war(边双连通)
题意
给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\)。
思路
先对原图边双缩点,然后变成了一棵树。在树上加一条边等价于使一条路径上的边都不是桥,那么原题转化为在树上删一条路径,使得最小的边最大。固定一条最小的边之后模拟即可。
代码
#include<bits/stdc++.h>
#define FOR(i, x, y) for(int i = (x), i##END = (y); i <= i##END; ++i)
#define DOR(i, x, y) for(int i = (x), i##END = (y); i >= i##END; --i)
template<typename T, typename _T> inline bool chk_min(T &x, const _T &y) {return y < x ? x = y, 1 : 0;}
template<typename T, typename _T> inline bool chk_max(T &x, const _T &y) {return x < y ? x = y, 1 : 0;}
typedef long long ll;
const int N = 10005;
const int M = 100005;
template<const int N, const int M, typename T> struct Linked_List
{
int head[N], nxt[M], tot; T to[M];
Linked_List() {clear();}
T &operator [](const int x) {return to[x];}
void clear() {memset(head, -1, sizeof(head)), tot = 0;}
void add(int u, T v) {to[tot] = v, nxt[tot] = head[u], head[u] = tot++;}
#define EOR(i, G, u) for(int i = G.head[u]; ~i; i = G.nxt[i])
};
struct edge {int to, cost;};
Linked_List<N, M << 1, edge> G;
Linked_List<N, N << 1, edge> T;
int dfn[N], low[N], stk[N], bel[N], dfn_idx, tp, bcc;
int miner[N], son[N];
int n, m;
void tarjan(int u, int fa_e)
{
dfn[u] = low[u] = ++dfn_idx, stk[++tp] = u;
EOR(i, G, u)
{
if(i == (fa_e ^ 1)) continue;
int v = G[i].to;
if(!dfn[v]) tarjan(v, i), chk_min(low[u], low[v]);
else if(dfn[v] < dfn[u]) chk_min(low[u], dfn[v]);
}
if(dfn[u] == low[u])
{
bcc++;
do bel[stk[tp]] = bcc; while(stk[tp--] != u);
}
}
void dfs(int u, int f)
{
miner[u] = 2e9, son[u] = 0;
EOR(i, T, u)
{
int v = T[i].to, w = T[i].cost;
if(v == f) continue;
dfs(v, u);
if(chk_min(miner[u], miner[v])) son[u] = v;
if(chk_min(miner[u], w)) son[u] = v;
}
}
int redfs(int u, int f)
{
if(!son[u]) return 2e9;
int res = redfs(son[u], u);
EOR(i, T, u)
{
int v = T[i].to, w = T[i].cost;
if(v == f || v == son[u]) continue;
chk_min(res, miner[v]);
chk_min(res, w);
}
return res;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
G.tot = T.tot = 0;
FOR(i, 1, n) G.head[i] = T.head[i] = -1;
FOR(i, 1, n) dfn[i] = 0;
bcc = dfn_idx = 0;
FOR(i, 1, m)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G.add(u, (edge){v, w}), G.add(v, (edge){u, w});
}
tarjan(1, -1);
int s, t, mi = 2e9;
FOR(u, 1, n) EOR(i, G, u)
{
int v = G[i].to, w = G[i].cost;
if(bel[u] < bel[v])
{
if(chk_min(mi, w)) s = bel[u], t = bel[v];
T.add(bel[u], (edge){bel[v], w}), T.add(bel[v], (edge){bel[u], w});
}
}
dfs(s, t), dfs(t, s);
int res = std::min(redfs(s, t), redfs(t, s));
printf("%d\n", (res > 1e9 ? -1 : res));
}
return 0;
}
HDU 4005 The war(边双连通)的更多相关文章
- HDU 4005 The war(双连通好题)
HDU 4005 The war pid=4005" target="_blank" style="">题目链接 题意:给一个连通的无向图.每条 ...
- HDU 4005 The war 双连通分量 缩点
题意: 有一个边带权的无向图,敌人可以任意在图中加一条边,然后你可以选择删除任意一条边使得图不连通,费用为被删除的边的权值. 求敌人在最优的情况下,使图不连通的最小费用. 分析: 首先求出边双连通分量 ...
- hdu 4005 The war
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 In the war, the intelligence about the enemy is ...
- HDU 3749 Financial Crisis (点双连通+并查集)
<题目连接> 题目大意: 给你一个(保证输入无重边,无自环)无向图,然后有下面Q条询问,每条询问为:问你u点与v点之间有几条(除了首尾两点外,其他点不重复)的路径.如果有0条或1条输出0或 ...
- HDU 4005 The war Tarjan+dp
The war Problem Description In the war, the intelligence about the enemy is very important. Now, o ...
- HDU 4005 The war (图论-tarjan)
The war Problem Description In the war, the intelligence about the enemy is very important. Now, our ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- HDU 3849 By Recognizing These Guys, We Find Social Networks Useful(双连通)
HDU 3849 By Recognizing These Guys, We Find Social Networks Useful pid=3849" target="_blan ...
- hdu 4612 Warm up 双连通缩点+树的直径
首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...
随机推荐
- 一个动态构建 LambdaExpression Tree 的示例
直接贴代码了: public class ExpressionTreeBuildingSampleTwo : Sample { public override string Name { get; } ...
- JSTL+EL表达式+JSP自定义框架案例
不会框架不要紧,我带你自定义框架 前言:这标题说的有点大了,当一回标题党,之前在学JSP的时候提到了JSTL和EL表达式,由于一直钟情于Servlet,迟迟没有更新别的,这回算是跳出来了.这回放个大招 ...
- c#编码注释
1 目录 2 前言... 3 2.1 编写目的... 3 2.2 适用范围... 4 3 命名规范... 4 3.1 命名约 ...
- 【随笔】CLR:.net的类型,内部到底长啥样?
前言 一提到.net的类型,首当其冲的就是“引用类型”.“值类型”:我们在面试中,也会经常被问“来说说值类型和引用类型....”,这时候第一反应就是:“哎呀,这还不简单,值类型是传递的值的copy,值 ...
- U盘安装CentOS 7提示 “Warning: /dev/root does not exist, could not boot” 解决办法
1.把U盘的Lable(即标签)修改成centos 2.在安装界面上按TAB键,修改启动路径,把”CENTOS\x207\x20x86_64″改成 “centos”
- 二叉搜索树(BST)基本操作
什么是二叉搜索树? 二叉搜索树也叫做二叉排序树.二叉查找树,它有以下性质: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若任意节点的右子树不空,则右子树上所有节点的值均大于它 ...
- 【MySQL高可用架构设计】(一)-- mysql复制功能介绍
一. 介绍 Mysql的复制功能是构建基于SQL数据库的大规模高性能应用的基础,主要用于分担主数据库的读负载,同时也为高可用.灾难恢复.备份等工作提供了更多的选择. 二.为什么要使用mysql复制功能 ...
- fd (int)读写文件
#include <string.h> #include <stdio.h> #include <fcntl.h> int main() { char *p1 = ...
- Lodop打印表格带页头页尾 高度是否包含页头页尾 转载
通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...
- PAC在异常检测中的应用
注:资料均来源于网络,本文只做知识分享,如侵立删,谢谢. PAC算法背景简述: 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研 ...