HDU 4738 Caocao's Bridges ——(找桥,求联通块)
题意:给你一个无向图,给你一个炸弹去炸掉一条边,使得整个图不再联通,你需要派人去安置炸弹,且派去的人至少要比这条边上的人多。问至少要派去多少个,如果没法完成,就输出-1。
分析:如果这个图是已经是多个联通块了,那么一个人都不用去,如果不是,那么只要找出这个无向图上的桥并且哨兵数量最少的那座把它炸了就行(输出这条边上的哨兵数量即可)。直接tarjan就可以写。
注意点:1.可能有重边,所以用手写邻接表的方式存图;2.如果一座桥上没有哨兵,那么你也得至少派去一个人去安置炸弹(因为炸弹不会自己飞过去啊233...)。
代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
const int N = + ; int n,m,head[N],tot,scc_cnt,dfn[N],low[N],dfs_clock,cnt;
bool vis[N*N],use[N];
//stack<int> S;
struct edge
{
int v,nxt,w;
}edges[N*N];
struct bridge
{
int u,v,w;
bool operator < (const bridge &temp) const
{
return w<temp.w;
}
};
vector<bridge> bridges;
void addEdge(int u,int v,int w)
{
edges[tot] = (edge){v,head[u],w};
head[u] = tot++;
edges[tot] = (edge){u,head[v],w};
head[v] = tot++;
} void init()
{
memset(head,-,sizeof(head));
tot = ;
//scc_cnt = 0;
dfs_clock = ;
memset(dfn,,sizeof(dfn));
bridges.clear();
memset(vis,false,sizeof(vis));
cnt = ;
memset(use,false,sizeof(use));
} void tarjan(int u)
{
dfn[u] = low[u] = ++dfs_clock;
//S.push(u);
for(int i=head[u];i!=-;i=edges[i].nxt)
{
if(vis[i]) continue;
// 因为可能存在有重边,所以这里必须这么写
vis[i] = vis[i^] = true;
int v = edges[i].v;
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u]) bridges.push_back((bridge){u,v,edges[i].w});
}
else if(dfn[v] < dfn[u])
{
low[u] = min(low[u],dfn[v]);
}
}
/*if(dfn[u]==low[u])
{
scc_cnt++;
for(;;)
{
int x = S.top();S.pop();
if(x == u) break;
}
}*/
} void dfs(int u)
{
use[u] = true;
for(int i=head[u];i!=-;i=edges[i].nxt)
{
int v = edges[i].v;
if(use[v]) continue;
dfs(v);
}
} void solve()
{
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++)
{
if(!use[i])
{
cnt++;
dfs(i);
}
} if(cnt==)
{
if(bridges.size()==) puts("-1");
else
{
sort(bridges.begin(),bridges.end());
printf("%d\n",bridges[].w==?:bridges[].w);
// 如果这座桥上没有人,周瑜也必须派一个人去放置炸弹
}
}
else puts("");
} int main()
{
while(scanf("%d%d",&n,&m)==)
{
if(n== && m==) break;
init();
for(int i=;i<=m;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
solve();
}
}
HDU 4738 Caocao's Bridges ——(找桥,求联通块)的更多相关文章
- HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4738 Caocao's Bridges 图--桥的判断模板
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4738 Caocao's Bridges(桥的最小权值+去重)
http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有一些岛屿被桥连接,每座都有士兵把守,周瑜想把这些岛屿分成两部分,但他只能炸毁一条桥,问最少 ...
- HDU 4738 Caocao's Bridges taijan (求割边,神坑)
神坑题.这题的坑点有1.判断连通,2.有重边,3.至少要有一个人背*** 因为有重边,tarjan的时候不能用子结点和父节点来判断是不是树边的二次访问,所以我的采用用前向星存边编号的奇偶性关系,用^1 ...
- Hdu 4738 Caocao's Bridges (连通图+桥)
题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...
- HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
Caocao's Bridges Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4738 Caocao's Bridges 求无向图的桥【Tarjan】
<题目链接> 题目大意: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.周瑜为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸 ...
- HDU——4738 Caocao's Bridges
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- Java Web ActiveMQ与WebService的异同
Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段 一.WebService:用来远程调用服务,达到打通系统.服务复用的目的.是SOA系统架构——面向服务架构的体现. ...
- git的详细安装
git的详细安装 Git 是时候动手尝试下 Git 了,不过得先安装好它.有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. 从源代码安装 若是条件允 ...
- vue入门:(模板语法与指令)
vuejs使用及HTML的模板语法,可以实现声明式将DOM绑定至底层VUE实例的数据.通过模板语法将数据渲染进DOM的系统,结合响应系统,在应用状态改变时,Vue能够计算出重新渲染组件的最小代价并应用 ...
- UEFI笔记 --- PeiReadOnlyVariable2->GetVariable()
问:在PEI阶段,PeiReadOnlyVariable2->GetVariable()可以从Pei Hob或NV RAM中获取UEFI变量,例如Setup默认值.若平台首次烧录BIOS并开机, ...
- sql 存储过程笔记
create procedure SP_Wim_GetWorkSubSectionById(@paramId as int)asbegindeclare @id as int;declare @lvI ...
- python将list元素转为数字
mask_x = ['11', '12', 13'] 方法1:for循环遍历 mask_x = [int(x) for x in mask_x] 方法2:map迭代 mask_x = list(map ...
- 【学】第一节 rt-thread的rt_kprintf功能的实现
@2019-06-20 [主题] 拿到一个stm32f407新板,使用rt-thread源码中的bsp中的stm32f407-discovery工程,操作串口外设实现rt_kprintf功能 [问题] ...
- 最简单webview跳转
String url = "http://www.qq.com" Uri uri=Uri.parse("http://www.baidu.com"); Inte ...
- QTP(3)
Test3001_Flight4a_手动启动录制购票 (VBS脚本) Window("Flight Reservation").WinObject("Date of Fl ...
- linux 用户和用户组
groupadd group1 useradd -g group1 user1 passwd user1 groups 查看当前用户的用户组 finger和id命令可以查看用户信息