POJ---1144 电话网络

POJ—1144 电话网络

题目描述

输入输出

输入样例

5
5 1 2 3 4
0
6
2 1 3
5 4 6 2
0
0

输出样例

1
2

题意分析

题中的电话交换机就是图中的点,线路双向说明是个无向图.题中至关重要的点也就是图中的割点,一旦出现了问题影响的点也就会有许多个.所以这个题主要是求割点的个数.

参考代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn = 105;
int n, root;
int head[maxn], cnt;
struct Edge {
   
	int to, next;
}e[maxn*maxn];
int low[maxn], dfn[maxn], num;
bool cut[maxn];//标记是否是割点
void add(int u, int v)
{
   
	e[++cnt].next = head[u];//把当前节点插入到head之后
	e[cnt].to = v;//修改新增节点的to值
	head[u] = cnt;//head中存放新增边结点的索引.
}//e的索引从1开始的,星图中且最后一个临界点的next值为0.

void tarjan(int u)
{
   
	dfn[u] = low[u] = ++num;
	int flag = 0;
	for (int i = head[u]; i; i = e[i].next)//如果最后i=0则说明,临界点已遍历完毕
	{
   
		int v = e[i].to;
		if (!dfn[v])
		{
   
			tarjan(v);
			low[u] = min(low[u], low[v]);
			if (low[v] >= dfn[u])
			{
   
				flag++;//符合割点条件的临界点的个数
				if (u != root || flag > 1)//如果非根且满足子节点low>父节点dfn,或是根且满足子节点low>根节点dfn个数>=2 则为割点.
				{
   
					cut[u] = true;//是割点
				}
			}
		}
		else {
   
			low[u] = min(low[u], dfn[v]);//已经遍历过则直接更新父节点u的值..
		}
	}
}

void init()//数组的更新
{
   
	memset(head, 0, sizeof(head));
	memset(low, 0, sizeof(low));
	memset(dfn, 0, sizeof(dfn));
	memset(cut, false, sizeof(cut));
	cnt = num = 0;
}

int main()
{
   
	while (cin >> n && n)//控制case
	{
   
		init();
		int u, v;
		while (cin >> u && u)//控制每个case
		{
   
			while (true)
			{
   
				char c = getchar();//每次获取空格
				if (c == '\n')
				{
   
					break;
				}
				cin >> v;
				add(u, v);
				add(v, u);

			}

		}
		for (int i = 1; i <= n; i++)//判断每个节点
		{
   
			if (!dfn[i])
			{
   
				root = i;
				tarjan(i);
			}
		}
		int ans = 0;//统计割点
		for (int i = 0; i <= n; i++)
		{
   
			if (cut[i])
			{
   
				ans++;
			}
		}
		cout << ans << endl;
	}
	return 0;
}

题目考点

  1. Tarjan求割点的使用
  2. 脸是双向星的使用.
全部评论

相关推荐

07-18 18:44
已编辑
中山职业技术学院 Java
投递文远知行等公司7个岗位
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务