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

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

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

参考代码:

 /*************************************************************************
> 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. Softmax函数与交叉熵

    在Logistic regression二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率.将这个问题进行泛化,推广到多分类问题中,我们可以使 ...

  2. 【UOJ#450】[集训队作业2018] 复读机

    题目链接 题目描述 群里有\(k\)个不同的复读机.为了庆祝平安夜的到来,在接下来的\(n\)秒内,它们每秒钟都会选出一位优秀的复读机进行复读.非常滑稽的是,一个复读机只有总共复读了\(d\)的倍数次 ...

  3. Vue结合后台的增删改案例

    首先列表内容还是与之前的列表内容类似,不过此处我们会采用Vue中数据请求的方式来实现数据的增删.那么我们使用的Vue第三方组件就是vue-resource,vue发起请求的方式与jQuery的ajax ...

  4. jquery扩展方法(表单数据格式化为json对象)

    1.jquery扩展方法(表单数据格式化为json对象) <script type="text/javascript"> // 将表单数据序列化为一个json对象,例如 ...

  5. hdu 1754 线段树 水题 单点更新 区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. SQL Server 2012 sa 用户登录 18456 错误 (转)

    转自:http://blog.csdn.net/waterxcfg304/article/details/40617475 最近想研究下SQL SERVER2012 Enterprise版本的数据库, ...

  7. box-shadow inset

    安卓支持,ios不支持:box-shadow: 0px 0px 2px inset rgba(0,0,0,0.08); 安卓,ios都支持:box-shadow: inset 0px 0px 2px ...

  8. mvn deploy上传私服Nexus时遇到的坑--ReasonPhrase: Forbidden.

    用maven deploy上传jar包时,遇到了ReasonPhrase: Forbidden 错误,截图如下: 折腾了好久,终于解决,现把步骤简单记录如下: 1.自建仓库eagle-sky: 2.设 ...

  9. SQL Server database mail问题诊断一例

    产品环境sql server database的mail发不出邮件,影响客户的业务,在数据库中进行诊断 诊断sql: EXEC msdb.dbo.sp_send_dbmail @profile_nam ...

  10. PostgreSQL 实现按月按年,按日统计 分组统计

    endtime 是 timestamp select to_char(endtime, 'YYYY-MM-DD') as d , count(objectid) FROM sde.polygon wh ...