In a computer network a link L, which interconnects two servers, is considered critical if there are at
least two servers A and B such that all network interconnection paths between A and B pass through L.
Removing a critical link generates two disjoint sub–networks such that any two servers of a sub–network
are interconnected. For example, the network shown in figure 1 has three critical links that are marked
bold: 0 -1, 3 - 4 and 6 - 7.
Figure 1: Critical links
It is known that:
1. the connection links are bi–directional;
2. a server is not directly connected to itself;
3. two servers are interconnected if they are directly connected or if they are interconnected with
the same server;
4. the network can have stand–alone sub–networks.
Write a program that finds all critical links of a given computer network.
Input
The program reads sets of data from a text file. Each data set specifies the structure of a network and
has the format:
no of servers
server0 (no of direct connections) connected server . . . connected server
. . .
serverno of servers (no of direct connections) connected server . . . connected server
The first line contains a positive integer no of servers(possibly 0) which is the number of network
servers. The next no of servers lines, one for each server in the network, are randomly ordered and
show the way servers are connected. The line corresponding to serverk, 0 ≤ k ≤ no of servers − 1,
specifies the number of direct connections of serverk and the servers which are directly connected to
serverk. Servers are represented by integers from 0 to no of servers − 1. Input data are correct. The
first data set from sample input below corresponds to the network in figure 1, while the second data
set specifies an empty network.
Output
The result of the program is on standard output. For each data set the program prints the number of
critical links and the critical links, one link per line, starting from the beginning of the line, as shown
in the sample output below. The links are listed in ascending order according to their first element.
The output for the data set is followed by an empty line.
Sample Input
8
0 (1) 1
1 (3) 2 0 3
2 (2) 1 3
3 (3) 1 2 4
4 (1) 3
7 (1) 6
6 (1) 7
5 (0)
0
Sample Output
3 critical links
0 - 1
3 - 4
6 - 7

0 critical links

 

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737

 

给你一个图,让你求这个图中哪些是桥,并输出;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
#define N 10005
#define met(a, b) memset(a, b, sizeof(a)) int dfn[N], low[N], Time, ans;
int n, f[N];
vector<vector<int> >G; struct node
{
int x, y;
bool friend operator < (node A,node B)
{
if(A.x == B.x)
return A.y < B.y;
return A.x < B.x;
}
}a[N]; void Init()
{
met(dfn, );
met(low, );
met(f, );
met(a, );
G.clear();
G.resize(n+);
Time = ;
} void Tarjan(int u, int fa)
{
low[u] = dfn[u] = ++Time;
f[u] = fa;
int len = G[u].size(), v;
for(int i=; i<len; i++)
{
v = G[u][i];
if(!dfn[v])
{
Tarjan(v, u);
low[u] = min(low[u], low[v]); if(low[v] > dfn[u])///判断是否是桥;
{
a[ans].x = u;
a[ans].y = v;
if(a[ans].x>a[ans].y)swap(a[ans].x, a[ans].y);
ans++;
}
}
else if(fa != v)
low[u] = min(dfn[v], low[u]);
}
} int main()
{
while(scanf("%d", &n) != EOF)
{
Init(); int u, v, m; for(int i=; i<n; i++)
{
scanf("%d (%d)", &u, &m);
for(int j=; j<m; j++)
{
scanf("%d", &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
ans = ; for(int i=; i<n; i++)
if(!dfn[i])
Tarjan(i, -); sort(a, a+ans); printf("%d critical links\n", ans);
for(int i=; i<ans; i++)
printf("%d - %d\n", a[i].x, a[i].y);
printf("\n");
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
#define N 10005
#define met(a, b) memset(a, b, sizeof(a)) int dfn[N], low[N], Time;
int n, f[N];
vector<vector<int> >G; struct node
{
int x, y;
bool friend operator < (node A,node B)
{
if(A.x == B.x)
return A.y < B.y;
return A.x < B.x;
}
}a[N]; void Init()
{
met(dfn, );
met(low, );
met(f, );
met(a, );
G.clear();
G.resize(n+);
Time = ;
} void Tarjan(int u, int fa)
{
low[u] = dfn[u] = ++Time;
f[u] = fa;
int len = G[u].size(), v;
for(int i=; i<len; i++)
{
v = G[u][i];
if(!dfn[v])
{
Tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(fa != v)
low[u] = min(dfn[v], low[u]);
}
} int main()
{
while(scanf("%d", &n) != EOF)
{
Init(); int u, v, m; for(int i=; i<n; i++)
{
scanf("%d (%d)", &u, &m);
for(int j=; j<m; j++)
{
scanf("%d", &v);
G[u].push_back(v);
G[v].push_back(u);
}
} for(int i=; i<n; i++)
if(!dfn[i])
Tarjan(i, -); int ans = ; for(int i=; i<n; i++)
{
v = f[i];
if(v!=- && low[i]>dfn[v])
{
a[ans].x = i;
a[ans].y = v;
if(a[ans].x>a[ans].y)swap(a[ans].x, a[ans].y);
ans++;
}
}
sort(a, a+ans); printf("%d critical links\n", ans);
for(int i=; i<ans; i++)
printf("%d - %d\n", a[i].x, a[i].y);
printf("\n");
}
return ;
}

UVA796 - Critical Links(Tarjan求桥)的更多相关文章

  1. UVA796 Critical Links(求桥) 题解

    题意:求桥 思路:求桥的条件是:(u,v)是父子边时 low[v]>dfn[u] 所以我们要解决的问题是怎么判断u,v是父子边(也叫树枝边).我们在进行dfs的时候,要加入一个fa表示当前进行搜 ...

  2. uva-796.critical links(连通图的桥)

    本题大意:求出一个无向图的桥的个数并且按照顺序输出所有桥. 本题思路:注意判重就行了,就是一个桥的裸题. 判重思路目前知道的有两种,第一种是哈希判重,第二种和邻接矩阵的优化一样,就是只存图的上半角或者 ...

  3. UVA 796 - Critical Links (求桥)

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

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

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

  5. UVA796 Critical Links —— 割边(桥)

    题目链接:https://vjudge.net/problem/UVA-796 In a computer network a link L, which interconnects two serv ...

  6. Tarjan 求桥,割,强连通

    最近遇到了这种模板题,记录一下 tarjan求桥,求割 #include <bits/stdc++.h> using namespace std; #define MOD 99824435 ...

  7. Tarjan求桥

    传送门(poj3177) 这道题是Tarjan求桥的模板题.大意是要求在原图上加上数量最少的边,使得整张图成为一个边双联通分量. 具体的做法是,先在图中求出所有的桥,之后把边双联通分量缩成点,这样的话 ...

  8. UVA 796 Critical Links(Tarjan求桥)

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

  9. uva 796 C - Critical Links(tarjan求桥)

    题目链接:https://vjudge.net/contest/67418#problem/C 题意:求出桥的个数并且按顺序输出 题解:所谓桥就是去掉这条边后连通块增加,套用一下模版就行. #incl ...

随机推荐

  1. par函数的bg参数-控制图片的背景色

    bg 参数用于控制图片的背景色,默认为白色 代码示例: par(bg = "pink") plot(1:5, 1:5, main = "title", xlab ...

  2. CentOS简单命令学习:date cal bc

    简单的shell指令: 1.日期的格式化显示: 2.日历的显示: 3.bc计算器: 使用Tab指令自动补全:

  3. Linux内核剖析 之 内存管理

    1. 内存管理区 为什么分成不同的内存管理区? ISA总线的DMA处理器有严格的限制:仅仅能对物理内存前16M寻址. 内核线性地址空间仅仅有1G,CPU不能直接訪问全部的物理内存. ZONE_DMA  ...

  4. linux 删除文件夹及其内容,显示文件路径

    比如要删除work文件夹包括里面的内容,则:rm -r /home/ftk/apache-tomcat-5.5.20/work,不管它是文件还是目录都删掉了 知道文件名 要查询文件大概地址用~cd ~ ...

  5. 解决myeclipse4.1.1对一个表生成映射文件的时候,出现“generating artifacts"的解决!

    很多人在用myeclipse4.1.1对一个表生成映射文件的时候,都出现“generating artifacts"的问题.我也遇到了这个问题,弄得我也很郁闷!看了很多人的帖子后还是无法搞定 ...

  6. Unity工程3D和2D开发模式切换

    在新建工程时,经常会选择默认的3D工程,但是如果想做2D游戏又不小心选了3D工程呢,总不能把工程删了重新建吧,有个办法就是打开 Edit > Project Settings > Edit ...

  7. VC++ 打开文件或文件夹对话框的实现方法

    实际工作开发中,由于各种应用,我们需要调用系统的打开文件对话框或者打开文件夹对话框,或两者兼有.特总结了常用的实现方法,仅供开发参考. 1. 打开文件对话框 常用的方法是使用系统的CFileDialo ...

  8. 阿里巴巴CI/CD之分层自动化

    一佛是阿里巴巴B2B事业群高级产品经理.从事多年互联网系统的研发和测试工作,目前主要负责云效分层自动化测试的产品设计.因为自动化测试在实践过程中,总是碰到各种各样的问题,导致进入自动化测试盲区.所以, ...

  9. mysql优化方法积累

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. Python Scrapy 自动爬虫注意细节(1)

    一.首次爬取模拟浏览器 在爬虫文件中,添加start_request函数.如: def start_requests(self): ua = {"User-Agent": 'Moz ...