题目: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)的更多相关文章

  1. 无向图的割点和桥 tarjan 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 20005; const int MAXM = 100005; ...

  2. Codeforces Round #161 (Div. 2) D. Cycle in Graph(无向图中找指定长度的简单环)

    题目链接:http://codeforces.com/problemset/problem/263/D 思路:一遍dfs即可,dp[u]表示当前遍历到节点u的长度,对于节点u的邻接点v,如果v没有被访 ...

  3. tarjan算法--求无向图的割点和桥

    一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中 ...

  4. tarjan算法--求解无向图的割点和桥

    1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥 也就是说 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥 2.割点:无向连通图中,如 ...

  5. 求 无向图的割点和桥,Tarjan模板

    /* 求 无向图的割点和桥 可以找出割点和桥,求删掉每个点后增加的连通块. 需要注意重边的处理,可以先用矩阵存,再转邻接表,或者进行判重 */ const int MAXN = 10010; cons ...

  6. Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂

    更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...

  7. [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), ...

  8. 割点和桥---Tarjan算法

    使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况:         (1)该节点是根节点,且有两棵以上的子树;         (2)该节 ...

  9. 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 ...

随机推荐

  1. xml转换为json格式时,如何将指定节点转换成数组 Json.NET

    使用Json.NET转换xml成json时,如果xml只有单个节点,但json要求是数组形式[], JsonConvert.SerializeXmlNode 并不能自动识别 示例如下: RecordA ...

  2. Guest Editors’ Introduction: Special Issue on Advances in Management of Softwarized Networks

    文章名称:Guest Editors’ Introduction:Special Issue on Advances in Management of Softwarized Networks 发表时 ...

  3. 背包问题(01背包,完全背包,多重背包(朴素算法&&二进制优化))

    写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题  题目  有m件物品和一个容量为 ...

  4. 编写高质量的Python代码系列(六)之内置模块

    Python预装了许多写程序时会用到的重要模块.这些标准软件包与通常意义上的Python语言联系得非常精密,我们可以将其当成语言规范的一部分.本节将会讲解基本的内置模块. 第四十二条:用functoo ...

  5. 【JS】JavaScript 指定日期增加天数

    指定某个日期(字符串),增加n天后,输出日期字符串,格式:年-月-日: /** * [dateAddDays 从某个日期增加n天后的日期] * @param {[string]} dateStr [日 ...

  6. Git复制已有分支到新分支开发

    如果我们需要在现有的分支代码基础上,复制代码到新分支进行开发,并推送至远程仓库,可以进行如下操作: 注:被复制的分支代码(ibis35),创建新的分支(ibis35-dev) 1. 切换到被copy的 ...

  7. Java使用AES算法进行加密解密

    一.加密 /** * 加密 * @param src 源数据字节数组 * @param key 密钥字节数组 * @return 加密后的字节数组 */ public static byte[] En ...

  8. Spring Boot 2.x以后static下面的静态资源被拦截

    今天创建一个新的Spring Boot项目,没注意到spring boot的版本,发现静态资源无法访问.百度一下发现好像是Spring Boot 2.0版本以后static目录不能直接访问. 接下来直 ...

  9. react native 安卓home返回键页面刷新

    import { withNavigationFocus } from 'react-navigation'; class Warngreete extends React.Component { c ...

  10. request redirection

    # encoding:utf-8 import reimport jsonimport randomfrom esdapi.config import BASE_URLfrom requests.se ...