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——电话网络(中文版)——题解(简略版)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1463&BUCU5973——战略游戏(中文版Strategic game)——题解

POJ 1144 Network

POJ 1144

poj1144 tarjan求割点

POJ1144 tarjan求割点模板

poj1144