HDU 4005 The war

pid=4005" target="_blank" style="">题目链接

题意:给一个连通的无向图。每条边有一个炸掉的代价。如今要建一条边(你不不知道的),然后你要求一个你须要的最少代价,保证无论他建在哪,你都能炸掉使得图不连通

思路:炸肯定要炸桥,所以先双连通缩点,得到一棵树,树边是要炸的,那么找一个最小值的边。从该边的两点出发。走的路径中,把两条包括最小值的路径。的两点连边。形成一个环。这个环就保证了最低代价在里面。除了这个环以外的最小边。就是答案,这种话,就利用一个dfs,搜到每一个子树的时候进行一个维护就可以

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; const int N = 10005;
const int M = 200005; int n, m; struct Edge {
int u, v, val, id;
bool iscut;
Edge() {}
Edge(int u, int v, int val, int id) {
this->u = u;
this->v = v;
this->val = val;
this->id = id;
this->iscut = false;
}
} edge[M]; int en, first[N], next[M]; void init() {
en = 0;
memset(first, -1, sizeof(first));
} void add_edge(int u, int v, int val, int id) {
edge[en] = Edge(u, v, val, id);
next[en] = first[u];
first[u] = en++;
} int pre[N], dfn[N], dfs_clock, bccn, bccno[N];
vector<Edge> bcc[N]; void dfs_cut(int u, int id) {
pre[u] = dfn[u] = ++dfs_clock;
for (int i = first[u]; i + 1; i = next[i]) {
if (edge[i].id == id) continue;
int v = edge[i].v;
if (!pre[v]) {
dfs_cut(v, edge[i].id);
dfn[u] = min(dfn[u], dfn[v]);
if (dfn[v] > pre[u])
edge[i].iscut = edge[i^1].iscut = true;
} else dfn[u] = min(dfn[u], pre[v]);
}
} void find_cut() {
dfs_clock = 0;
memset(pre, 0, sizeof(pre));
for (int i = 1; i <= n; i++)
if (!pre[i]) dfs_cut(i, -1);
} void dfs_bcc(int u) {
bccno[u] = bccn;
for (int i = first[u]; i + 1; i = next[i]) {
if (edge[i].iscut) continue;
int v = edge[i].v;
if (bccno[v]) continue;
dfs_bcc(v);
}
} const int INF = 0x3f3f3f3f; Edge Mine; void find_bcc() {
bccn = 0;
memset(bccno, 0, sizeof(bccno));
for (int i = 1; i <= n; i++) {
if (!bccno[i]) {
bccn++;
dfs_bcc(i);
}
}
for (int i = 1; i <= bccn; i++) bcc[i].clear();
Mine.val = INF;
for (int i = 0; i < en; i++) {
if (!edge[i].iscut) continue;
if (Mine.val > edge[i].val)
Mine = edge[i];
int u = bccno[edge[i].u], v = bccno[edge[i].v], w = edge[i].val;
bcc[u].push_back(Edge(u, v, w, 0));
}
} int ans; int dfs(int u, int f) {
int Min1 = INF, Min2 = INF;
for (int i = 0; i < bcc[u].size(); i++) {
int v = bcc[u][i].v;
if (v == f) continue;
Min2 = min(min(dfs(v, u), bcc[u][i].val), Min2);
if (Min2 < Min1) swap(Min1, Min2);
}
ans = min(ans, Min2);
return Min1;
} int main() {
while (~scanf("%d%d", &n, &m)) {
init();
int u, v, w;
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
if (u > n || v > n) continue;
add_edge(u, v, w, i);
add_edge(v, u, w, i);
}
find_cut();
find_bcc();
if (bccn == 1) {
printf("-1\n");
continue;
}
ans = INF;
u = bccno[Mine.u]; v = bccno[Mine.v];
dfs(u, v);
dfs(v, u);
if (ans == INF) ans = -1;
printf("%d\n", ans);
}
return 0;
}

HDU 4005 The war(双连通好题)的更多相关文章

  1. HDU 4005 The war 双连通分量 缩点

    题意: 有一个边带权的无向图,敌人可以任意在图中加一条边,然后你可以选择删除任意一条边使得图不连通,费用为被删除的边的权值. 求敌人在最优的情况下,使图不连通的最小费用. 分析: 首先求出边双连通分量 ...

  2. HDU 4738 双连通模版题

    九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711577 题意:给定n个点,m条无向边 下面m行表示u , v ,边权值 求 ...

  3. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  4. hdu 4612 Warm up 双连通缩点+树的直径

    首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...

  5. HDU 4005 The war(边双连通)

    题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 ​ 先对原图边双缩点,然后变成了一棵树.在 ...

  6. hdu 4005 The war

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4005 In the war, the intelligence about the enemy is ...

  7. Hdu4005-The war(双连通缩点)

    In the war, the intelligence about the enemy is very important. Now, our troop has mastered the situ ...

  8. HDU 4005 The war Tarjan+dp

    The war Problem Description   In the war, the intelligence about the enemy is very important. Now, o ...

  9. hdu 4612 Warm up 双连通+树形dp思想

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

随机推荐

  1. jquery实现鼠标移入移除背景图片切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. [ Luogu 3935 ] Calculating

    \(\\\) \(Description\) 若\(x\)分解质因数结果为\(x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n}\),令\(f(x)=(k_1+1)(k_2+1) ...

  3. [Testing][API][soapUI] 測試API 的軟體工具紀錄

    soapUI 測試API 的軟體工具紀錄 http://files.cnblogs.com/vincentmylee/soapUIScript%E9%9C%80%E8%A6%81%E8%B3%87%E ...

  4. 3星|《未来公司》:Uber简史

    未来公司(卡兰尼克和他的Uber帝国)(精) 从Uber创始人卡兰尼克的角度讲的Uber简史,截止到2017年.书中有不少Uber的负面新闻,比国内的同类书要好. 基本是流水账.想了解这家公司的历史, ...

  5. swift 扩展 要素总结

    类: 协议: 泛型及元素类型:扩展约束:

  6. 分析器错误消息: 该配置节不能包含 CDATA 或文本元素。

    原因当然是web.config配置文件中,有字符串文本了,估计不小心加上的一些字符,所以会报错,去掉就行,例如13行的s

  7. webstom2017最新破解 ------------ http://blog.csdn.net/voke_/article/details/76418116

    webstorm 作为最近最火的前端开发工具,也确实对得起那个价格,但是秉着勤俭节约的传统美德,我们肯定是能省则省啊. 方法一:(更新时间:2018/1/23)v3.3 注册时,在打开的License ...

  8. JavaScipt30(第五个案例)(主要知识点:flex布局)

    承接上文,这是第5个案例:这节没什么讲的,随便记录下吧,主要是用了flex布局与transform translateY,js部分和案例1类似. 附上项目链接: https://github.com/ ...

  9. Pycharm 专业版安装

    1.Pycharm官网,网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己电脑的操作系统进行 ...

  10. 02网页<body></body>常用标记及属性

    网页<body></body>常用标记及属性 <body></body>标记表示的是在整个浏览器内容框架中显示的部分. text属性用于控制HTML文档 ...