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. C# 更改 Hashtable key 名称

    Hashtable ht = new Hashtable(); ht[; ht["B"] = ht["标题"]; ht.Remove("标题" ...

  2. Quartz监听器

    1.概念Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.TriggerLi ...

  3. 【Leetcode】国王挖金矿

    参考该文章 https://www.cnblogs.com/henuliulei/p/10041737.html #include <iostream> #include <cstr ...

  4. Tensorflow2.0变化

    https://baijiahao.baidu.com/s?id=1627307436158652578&wfr=spider&for=pc https://zhidao.baidu. ...

  5. Anaconda安装PyTorch

    Anaconda是一个Python语言管理器,支持安装基于Python的开发包,例如tensorflow.Pytorch等,以及各种基于Python的IDE. https://www.jb51.net ...

  6. Spring Cloud Stream教程(一)介绍Spring Cloud Stream

    Spring Cloud Stream是构建消息驱动的微服务应用程序的框架.Spring Cloud Stream基于Spring Boot建立独立的生产级Spring应用程序,并使用Spring I ...

  7. sqli-libs(7)

    导出文件GET字符型注入 0x01介绍 导出到文件就是可以将查询结果导出到一个文件中,如常见的将一句话木马导出到一个php文件中,sqlmap中也有导出一句话和一个文件上传的页面 常用的语句是:  s ...

  8. bitmap相关工具类

    一,bitmap工具 封装了以下方法: 1,获取activity屏幕截图,保存为图片文件 2,从文件中获取截图,返回bitmap对象 package com.ctbri.weather.utils; ...

  9. Oracle开发:normal ,sysdba,sysoper区别

    Oracle将用户分成两类:[system]和[sys] [system]用户只能用normal身份登陆em.(可以看成公司的普通成员) [sys]用户具有“SYSDBA”(可以看成公司的CEO)或者 ...

  10. 在WCF程序中动态修改app.config配置文件

    今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google搜了一下,在园子里的文章动态修改App.Config 和w ...