Caocao's Bridges

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10933    Accepted Submission(s): 3065

Problem Description
Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army still was not good at water battles, so he came up with another idea. He built many islands in the Changjiang river, and based on those islands, Caocao's army could easily attack Zhou Yu's troop. Caocao also built bridges connecting islands. If all islands were connected by bridges, Caocao's army could be deployed very conveniently among those islands. Zhou Yu couldn't stand with that, so he wanted to destroy some Caocao's bridges so one or more islands would be seperated from other islands. But Zhou Yu had only one bomb which was left by Zhuge Liang, so he could only destroy one bridge. Zhou Yu must send someone carrying the bomb to destroy the bridge. There might be guards on bridges. The soldier number of the bombing team couldn't be less than the guard number of a bridge, or the mission would fail. Please figure out as least how many soldiers Zhou Yu have to sent to complete the island seperating mission.
 
Input
There are no more than 12 test cases.

In each test case:

The first line contains two integers, N and M, meaning that there are N islands and M bridges. All the islands are numbered from 1 to N. ( 2 <= N <= 1000, 0 < M <= N2 )

Next M lines describes M bridges. Each line contains three integers U,V and W, meaning that there is a bridge connecting island U and island V, and there are W guards on that bridge. ( U ≠ V and 0 <= W <= 10,000 )

The input ends with N = 0 and M = 0.

 
Output
For each test case, print the minimum soldier number Zhou Yu had to send to complete the mission. If Zhou Yu couldn't succeed any way, print -1 instead.
 
Sample Input
3 3
1 2 7
2 3 4
3 1 4
3 2
1 2 7
2 3 4
0 0
 
Sample Output
-1
4
 
Source
 
Recommend
liuyiding
 
 
下面的代码是使用并查集判环,实际上只需要在每次进行tarjan算法时给计数器加一,就知道有几个连通块了,在哪加我标出来了
 /*************************************************************************
> File Name: hdu-4738.caocaos_bridges.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月07日 星期六 21时41分41秒
本题思路:无向图所有桥中权值的那条桥的权值.
注意:有重边,如果桥上没敌人,需要有人抗tnt,因此需要输出1.
如果初始图不连通则输出0.
************************************************************************/ #include <cstdio>
#include <cstring>
#include <map>
using namespace std; const int maxn = + , maxm = maxn * maxn + , inf = 0x3f3f3f3f;
int n, m;
int tot, head[maxn]; int bridge, top, Index, min_bridge;
int dfn[maxn], low[maxn], stack[maxn];
bool instack[maxn]; map<int, int> mp; struct Edge {
int to, cost, next;
bool cut;
} edge[maxm << ]; int min(int x, int y) {
return x > y ? y : x;
} void init() {
mp.clear();
memset(head, -, sizeof head);
tot = ;
} void addedge(int u, int v ,int w) {
edge[tot] = (Edge){v, w, head[u], false}; head[u] = tot ++;
edge[tot] = (Edge){u, w, head[v], false}; head[v] = tot ++;
} bool ishash(int u, int v) {
return mp[u * maxn + v] ++ || mp[v * maxn + u] ++;
} void tarjan(int u, int pre) {
int v;
stack[top ++] = u;
instack[u] = true;
dfn[u] = low[u] = ++ Index;
int pre_cnt = ;
for(int i = head[u]; ~i; i = edge[i].next) {
v = edge[i].to;
if(v == pre && pre_cnt == ) {
pre_cnt ++;
continue;
}
if(!dfn[v]) {
tarjan(v, u);
if(low[u] > low[v]) low[u] = low[v];
if(low[v] > dfn[u]) {
edge[i].cut = true;
edge[i ^ ].cut = true;
min_bridge = min(min_bridge, edge[i].cost);
bridge ++;
}
} else if(low[u] > dfn[v]) low[u] = dfn[v];
}
top --;
instack[u] = false;
} void solve() {
memset(instack, false, sizeof instack);
memset(dfn, , sizeof dfn);
memset(low, , sizeof low);
top = Index = bridge = ;
min_bridge = inf;
for(int i = ; i <= n; i ++) {
if(!dfn[i]) {
tarjan(i, i);//cnt ++;
}
}
if(min_bridge == inf) min_bridge = -;
else if(min_bridge == ) min_bridge = ;//if cnt != 1 : min_bridge = 0;
printf("%d\n", min_bridge);
} int fa[maxn]; int find(int x) {
if(fa[x] != x) return fa[x] = find(fa[x]);
else return x;
} void unionset(int u, int v) {
u = find(u);
v = find(v);
if(u != v) fa[u] = v;
} int main() {
int u, v, w;
while(~scanf("%d %d", &n, &m) && (n || m)) {
init();
for(int i = ; i <= n; i ++) fa[i] = i;
for(int i = ; i < m; i ++) {
scanf("%d %d %d", &u, &v, &w);
// if(ishash(u, v)) continue;
addedge(u, v, w);
unionset(u, v);
}
bool flag = true;
for(int i = ; i <= n; i ++)
if(find(i) != find()) {
flag = false;
break;
}
if(flag)
solve();
else printf("0\n");
}
return ;
}

hdu-4738.Caocao's Bridges(图中权值最小的桥)的更多相关文章

  1. hdu 4738 Caocao's Bridges 图--桥的判断模板

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...

  3. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

  4. 【HDU 4738 Caocao's Bridges】BCC 找桥

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:给定一个n个节点m条边的无向图(可能不连通.有重边),每条边有一个权值.判断其连通性,若双 ...

  5. Hdu 4738 Caocao's Bridges (连通图+桥)

    题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...

  6. hdu 4738 Caocao's Bridges 求无向图的桥【Tarjan】

    <题目链接> 题目大意: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.周瑜为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸 ...

  7. hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)

    /* 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! tm太坑了... 1,如果这个无向图开始就是一个非连通图,直接输出0 2,重边(两个节点存在多条边, 权值不一样) 3,如果找到 ...

  8. HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】

     Caocao's Bridges Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. java面向对象1-面向对象概念

    面向对象概念-类与对象的关系 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private-构造方法/构造器-this关键字-static关键字(javadoc制作工具类) -代码块 继承 ...

  2. formant

    1.函数功能将一个数值进行格式化显示. 2. 如果参数format_spec未提供,则和调用str(value)效果相同,转换成字符串格式化. >>> format(3.141593 ...

  3. 容器"共享"宿主机的hosts文件(终极方案)

    0.背景 有时候制作docker镜像生成容器时需要宿主机的hosts文件共享到容器中.首先想的是通过挂载的方式共享hosts文件,但是实践时发现根本行不通,hosts文件在/etc/目录下,如进行挂载 ...

  4. linux查杀minergate-cli/minerd病毒

    redis的漏洞让公司的服务器中了挖矿的病毒,入侵者在服务器上留了后门.每次只是把进程杀杀,但是过段时间病毒又回来了,这个事情一直让人头疼.先是minerd的病毒入侵,后是minergate-cli入 ...

  5. 【leetcode】1210. Minimum Moves to Reach Target with Rotations

    题目如下: In an n*n grid, there is a snake that spans 2 cells and starts moving from the top left corner ...

  6. 全方面了解和学习PHP框架 PHP培训教程

    PHP成为最流行的脚本语言有许多原因:灵活性,易用性等等.对于项目开发来说,我们通常需要一个PHP框架来代替程序员完成那些重复的部分.本文,兄弟连将对PHP框架进行全面解析. PHP框架是什么? PH ...

  7. go语言系列--golang在windows上的安装和开发环境goland的配置

    在windows上安装golang软件 golang中国网址为:https://studygolang.com/dl 我的学习选择版本:1.12.5 golang 1.12.5版本更新的内容:gola ...

  8. POJ 2778 DNA Sequence ( Trie图、矩阵快速幂 )

    题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析: 我们先分析Tire 图的结构 : Trie图是在AC自动机的原型上增添边使得状态可以快速转移,标记危 ...

  9. Servlet的常见错误

    Servlet常见的错误: 1.404错误:资源未找到 原因一:在请求地址中的servlet的别名书写错误. 原因二:虚拟机项目名称拼写错误. 2.500错误:内部服务器错误 错误一: java.la ...

  10. 不能访问windows installer服务

    xp系统安装msi类型的安装程序出现以下错误: 不能访问windows installer服务. 解决办法 1:运行cmd -> regsvr32 msi.dll 运行services.msc- ...