本题大意:求出一个无向图的桥的个数并且按照顺序输出所有桥.

本题思路:注意判重就行了,就是一个桥的裸题.

  判重思路目前知道的有两种,第一种是哈希判重,第二种和邻接矩阵的优化一样,就是只存图的上半角或者下半角.

参考代码:

 /*************************************************************************
> File Name: uva-796.critical_links.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月06日 星期五 15时58分54秒
本题思路:注意边的判重.
************************************************************************/ #include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
using namespace std; const int maxn = + , maxm = maxn * maxn + ;
int n;
struct Edge {
int to, next;
bool cut;
} edge[maxm];
int head[maxn], tot;
int low[maxn], dfn[maxn],stack[maxn];
int Index, top, bridge;
bool instack[maxn];
bool cut[maxn];
int add_block[maxn]; void addedge(int u, int v) {
edge[tot].to = v; edge[tot].next = head[u]; edge[tot].cut = false;
head[u] = tot ++;
} void init() {
memset(head, -, sizeof head);
tot = ;
} map<int, int> mp;
vector <pair<int, int> > ans; void tarjan(int u, int pre) {
int v;
low[u] = dfn[u] = ++ Index;
instack[u] = true;
int son = ;
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]) {
son ++;
tarjan(v, u);
if(low[u] > low[v]) low[u] = low[v];
if(low[v] > dfn[u]) {
bridge ++;
edge[i].cut = true;
edge[i ^ ].cut = true;
}
if(u != pre && low[v] >= dfn[u]) {
cut[u] = true;
add_block[u] ++;
}
} else if(low[u] > dfn[v]) low[u] = dfn[v];
}
if(u == pre && son > ) cut[u] = true;
if(u == pre) add_block[u] = son - ;
instack[u] = false;
top --;
} void solve() {
memset(dfn, , sizeof dfn);
memset(instack, false, sizeof instack);
memset(add_block, , sizeof add_block);
memset(cut, false, sizeof cut);
Index = top = bridge = ;
ans.clear();
for(int i = ; i < n; i ++)
if(!dfn[i])
tarjan(i, i);
printf("%d critical links\n", bridge);
for(int u = ; u < n; u ++) {
for(int i = head[u]; ~i; i = edge[i].next) {
if(edge[i].cut && edge[i].to > u) ans.push_back(make_pair(u, edge[i].to));
}
}
sort(ans.begin(), ans.end());
for(int i = ; i < ans.size(); i ++)
printf("%d - %d\n", ans[i].first, ans[i].second);
printf("\n");
} inline bool ishash(int u, int v) {
return !(mp[u * maxn + v]++ || mp[v * maxn + u]++);
} int main() {
int u, num, v;
while(scanf("%d", &n) == ) {
mp.clear();
init();
for(int i = ; i < n; i ++) {
scanf("%d (%d)", &u, &num);
for(int i = ; i < num; i ++) {
scanf("%d", &v);
if(ishash(u, v)) continue;
addedge(u, v);
addedge(v, u);
}
}
solve();
}
return ;
}

uva-796.critical links(连通图的桥)的更多相关文章

  1. UVA 796 Critical Links(无向图求桥)

    题目大意:给你一个网络要求这里面的桥. 输入数据: n 个点 点的编号  (与这个点相连的点的个数m)  依次是m个点的   输入到文件结束. 桥输出的时候需要排序   知识汇总: 桥:   无向连通 ...

  2. UVA 796 - Critical Links (求桥)

    Critical Links  In a computer network a link L, which interconnects two servers, is considered criti ...

  3. Uva 796 Critical Links (割边+排序)

    题目链接: Uva 796 Critical Links 题目描述: 题目中给出一个有可能不连通的无向图,求出这个图的桥,并且把桥按照起点升序输出(还有啊,还有啊,每个桥的起点要比终点靠前啊),这个题 ...

  4. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA 796 Critical Links(模板题)(无向图求桥)

    <题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...

  6. UVA 796 Critical Links(Tarjan求桥)

    题目是PDF就没截图了 这题似乎没有重边,若有重边的话这两点任意一条边都不是桥,跟求割点类似的原理 代码: #include <stdio.h> #include <bits/std ...

  7. UVA 796 - Critical Links 无向图字典序输出桥

    题目:传送门 题意:给你一个无向图,你需要找出里面的桥,并把所有桥按字典序输出 这一道题就是用无向图求桥的模板就可以了. 我一直错就是因为我在输入路径的时候少考虑一点 错误代码+原因: 1 #incl ...

  8. Uva 796 Critical Links 找桥

    这个题很简单,但是输入有毒,用字符串的我一直RE 然后换成这样瞬间AC #include <stdio.h> #include <string.h> #include < ...

  9. UVA 796 Critical Links —— (求割边(桥))

    和求割点类似,只要把>=改成>即可.这里想解释一下的是,无向图没有重边,怎么可以使得low[v]=dfn[u]呢?只要它们之间再来一个点即可. 总感觉图论要很仔细地想啊- -一不小心就弄混 ...

  10. UVA 796 Critical Links

    输出桥. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

随机推荐

  1. 【leetcode】1214.Two Sum BSTs

    题目如下: Given two binary search trees, return True if and only if there is a node in the first tree an ...

  2. 【mysql】全文索引match多列报错

    表结构如下: CREATE TABLE `T` ( .... FULLTEXT KEY `title_fc` (`titleindex`), FULLTEXT KEY `shortname_fc` ( ...

  3. 关于python pip安装第三方库 jieba 中文分词工具后提示"ImportError: cannot import name 'Random'"报错问题

    具体错误提示如下: >>> import jieba Traceback (most recent call last): File "<stdin>" ...

  4. linux lazarus 连接mssqlserver

    1 . 从https://www.freetds.org/ 下载驱动源文件 2. 参照 https://www.freetds.org/userguide/config.htm 内容编译 3. 启动l ...

  5. CQOI2010 传送带

    题目链接:戳我 分别枚举线段AB上的出发点,和线段CD上的到达点,然后时间直接计算,取min就可以了. 但是这样子显然会T飞,(相当于1e5的平方吧?)所以我们进一步考虑性质. 然后打表(或者感性理解 ...

  6. 运行roslaunch启动节点报错找不到节点

    报错信息: ERROR: cannot launch node of type [${package_name}/${package_name}_node]: can't locate node [$ ...

  7. 2019 南京网络赛A

    南京网络赛自闭现场 https://nanti.jisuanke.com/t/41298 二维偏序经典题型 二维前缀和!!! #include<bits/stdc++.h> using n ...

  8. esLint——规范你的代码(转)

    团队协作时,若是团队的代码风格统一,能够大大减少沟通成本. 什么是 ESLint ? ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码 ...

  9. SpEL 实例

    SpEl 实例 基于 Spring 解析 @RestController @RequestMapping("/spel") @Slf4j public class SpELCont ...

  10. 如何将EDM数据分类工作做的更加真善美

    众所周知,数据是互联网时代营销的决定性因素,数据的好坏关乎到营销能力的强弱,而细化到EDM行业中,数据细分变得极为重要,根据数据形态的不同,将会涉及到多种不同的细分方法,有效的利用这些方法,将会大大的 ...