POJ1144&BUCU5892——电话网络(中文版)——题解(简略版)
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1144&BUCU5892——电话网络(中文版)——题解(简略版)相关的知识,希望对你有一定的参考价值。
电话网络
时间限制:1秒
空间限制:256M
题目描述
电话公司正在创建一个新的电话网络,每个地方都有一个电话交换机(编号为1~N)。线路是双向的,并且总是将两个地方连接在一起,在灭个地方,线路都终止与电话交换机。从每个地方都可以通过线路达到其他地方,但不需要直接相连,可以进行多次交换。有时候在某个地方发生故障,会导致交换机无法运行。在这种情况下,除了无法到达失败的地方,还可能导致其他地方无法连接。这个地方(发生故障的地方)是至关重要的。请写程序来查找所有关键位置的数量。
输入描述
输入包含多个测试用例,每个测试用例都描述一个网络,对于每个测试用例:
第一行一个正整数N
接下来最多N行每行中,每行包含一个地点的编号,后面是该地方可以直达的地点的编号。每个测试用例都以一条仅包含0的行结束。N=0时输入结束,不处理。
数据范围
- N < 100 N < 100 N<100
输出描述
对每个测试用例,都单行输出关键位置的数量。
样例一
输入
5
5 1 2 3 4
0
6
2 1 3
5 4 6 2
0
0
输出
1
2
题目分析
本题利用Tarjan算法求解即可。
AC代码
/*
* @Author: LetMeFly
* @Date: 2022-01-14 17:40:47
* @LastEditors: LetMeFly
* @LastEditTime: 2022-01-14 17:56:54
*/
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
struct edge
int to, next;
;
edge a[500];
int head[111], dfn[111], low[111];
bool cut[111];
int cnt, tot, ans;
void init(int n)
cnt = tot = ans = 0;
for (int i = 0; i <= n; i++)
head[i] = -1;
dfn[i] = low[i] = 0;
cut[i] = false;
void add(int l, int r)
a[tot].to = r;
a[tot].next = head[l];
head[l] = tot++;
void tarjan(int x, int fx)
dfn[x] = low[x] = ++cnt;
int child = 0;
for (int i = head[x]; ~i; i = a[i].next)
int y = a[i].to;
if (!dfn[y])
child++;
tarjan(y, x);
low[x] = min(low[x], low[y]);
if (low[y] >= dfn[x] && x != 1)
if (!cut[x])
ans++;
cut[x] = true;
else if (dfn[y] < dfn[x] && y != fx)
low[x] = min(low[x], dfn[y]);
if (child >= 2 && x == 1)
if (!cut[x])
ans++;
cut[x] = true;
int main()
int n;
while (cin >> n && n)
init(n);
int x;
while (cin >> x && x != 0)
while (getchar() != '\\n')
int y;
cin >> y;
add(x, y);
add(y, x);
tarjan(1, -1);
cout << ans << endl;
return 0;
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/122498795
以上是关于POJ1144&BUCU5892——电话网络(中文版)——题解(简略版)的主要内容,如果未能解决你的问题,请参考以下文章