在无向图中找最短桥(tarjan)
题目:hdu 4738
题目意思: 曹操有N个岛,这些岛用M座桥连接起来
每座桥有士兵把守(也可能没有)
周瑜想让这N个岛不连通,但只能炸掉一座桥
并且炸掉一座桥需要派出不小于守桥士兵数的人去
解题思路: 首先判断图是否连通,不连通则不需要去炸桥,输出0
图连通,则可以用Tarjan找割边
割边不存在输出-1表示不能达到目的
找到所有的割边,只需要炸掉其中守兵数最少的桥即可
PS: 桥的守兵数为0时,也需要派出一个人去
还要注意一下重边的问题,是重边的话一定不是桥,我用邻接表记录的,是重边的话 我就距离变成INF
#include<bits/stdc++.h>
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a));
typedef long long ll;
const int INF=0x3f3f3f3f;
using namespace std;
int vim[],dfn[];
vector<int>q[];
int jg[][];
int ans;
int top;
void tarjan(int x,int fa)
{ vim[x]=dfn[x]=++top;
for(int i:q[x])
{ if(i==fa)continue;
if(!dfn[i])
{
tarjan(i,x);
vim[x]=min(vim[i],vim[x]);
// cout<<vim[i]<<" "<<dfn[x]<<endl;
if(vim[i]>dfn[x])
{
ans=min(ans,jg[x][i]);
}
}
else
{
vim[x]=min(vim[x],dfn[i]);
}
} }
int main()
{
int n,m;
while(cin>>n>>m&&n+m){
ans=INF;mem(vim);mem(dfn);
for(int i=;i<=n;i++)
q[i].clear();
memset(jg,,sizeof(jg));
for(int i=;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
q[a].pb(b);
q[b].pb(a);
if(!jg[a][b]){
jg[a][b]=jg[b][a]=c;}
else { jg[a][b]=jg[b][a]=INF;
}
}
int q=;
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i,),q++;
if(q>)cout<<<<endl;
else if(ans==INF)cout<<-<<endl;
else if(!ans)cout<<<<endl;
else cout<<ans<<endl;
}}
在无向图中找最短桥(tarjan)的更多相关文章
- 无向图的割点和桥 tarjan 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 20005; const int MAXM = 100005; ...
- Codeforces Round #161 (Div. 2) D. Cycle in Graph(无向图中找指定长度的简单环)
题目链接:http://codeforces.com/problemset/problem/263/D 思路:一遍dfs即可,dp[u]表示当前遍历到节点u的长度,对于节点u的邻接点v,如果v没有被访 ...
- tarjan算法--求无向图的割点和桥
一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中 ...
- tarjan算法--求解无向图的割点和桥
1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥 也就是说 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥 2.割点:无向连通图中,如 ...
- 求 无向图的割点和桥,Tarjan模板
/* 求 无向图的割点和桥 可以找出割点和桥,求删掉每个点后增加的连通块. 需要注意重边的处理,可以先用矩阵存,再转邻接表,或者进行判重 */ const int MAXN = 10010; cons ...
- Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂
更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...
- [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
- 割点和桥---Tarjan算法
使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况: (1)该节点是根节点,且有两棵以上的子树; (2)该节 ...
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
随机推荐
- xml转换为json格式时,如何将指定节点转换成数组 Json.NET
使用Json.NET转换xml成json时,如果xml只有单个节点,但json要求是数组形式[], JsonConvert.SerializeXmlNode 并不能自动识别 示例如下: RecordA ...
- Guest Editors’ Introduction: Special Issue on Advances in Management of Softwarized Networks
文章名称:Guest Editors’ Introduction:Special Issue on Advances in Management of Softwarized Networks 发表时 ...
- 背包问题(01背包,完全背包,多重背包(朴素算法&&二进制优化))
写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下 01背包 大家先看一下这道01背包的问题 题目 有m件物品和一个容量为 ...
- 编写高质量的Python代码系列(六)之内置模块
Python预装了许多写程序时会用到的重要模块.这些标准软件包与通常意义上的Python语言联系得非常精密,我们可以将其当成语言规范的一部分.本节将会讲解基本的内置模块. 第四十二条:用functoo ...
- 【JS】JavaScript 指定日期增加天数
指定某个日期(字符串),增加n天后,输出日期字符串,格式:年-月-日: /** * [dateAddDays 从某个日期增加n天后的日期] * @param {[string]} dateStr [日 ...
- Git复制已有分支到新分支开发
如果我们需要在现有的分支代码基础上,复制代码到新分支进行开发,并推送至远程仓库,可以进行如下操作: 注:被复制的分支代码(ibis35),创建新的分支(ibis35-dev) 1. 切换到被copy的 ...
- Java使用AES算法进行加密解密
一.加密 /** * 加密 * @param src 源数据字节数组 * @param key 密钥字节数组 * @return 加密后的字节数组 */ public static byte[] En ...
- Spring Boot 2.x以后static下面的静态资源被拦截
今天创建一个新的Spring Boot项目,没注意到spring boot的版本,发现静态资源无法访问.百度一下发现好像是Spring Boot 2.0版本以后static目录不能直接访问. 接下来直 ...
- react native 安卓home返回键页面刷新
import { withNavigationFocus } from 'react-navigation'; class Warngreete extends React.Component { c ...
- request redirection
# encoding:utf-8 import reimport jsonimport randomfrom esdapi.config import BASE_URLfrom requests.se ...