测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40823. 发现环

填空题 困难

题目描述

发现环

题目描述

小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。

不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。

为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?

输入格式

第一行包含一个整数N。

以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。

对于30%的数据,1 <= N <= 1000

对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N

输入保证合法。 

输出格式

按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。

样例输入

5

1 2

3 1

2 4

2 5

5 3

样例输出

1 2 3 5

参考答案

#include <iostream> #include <vector> using namespace std; int main(){ int n; cin>>n; vector<int> Lists[n+1];//记录节点 int listCount[n+1]={0};//记录节点连接的个数 for(int i=0;i<n;i++){ int a,b; cin>>a>>b; Lists[a].push_back(b);//在a节点内加入b Lists[b].push_back(a);//在b节点内加入a listCount[a]++;//记录a节点连接个数 listCount[b]++;//记录b节点连接个数 } for(int i=1;i<=n;i++){ if(listCount[i]==1){//碰到叶子节点 int tmp1=i; while(listCount[tmp1]==1){//依次删除与之连接的顶点 int tmp2=Lists[tmp1][0]; listCount[tmp2]--; tmp1=tmp2; } } } for(int i=1;i<=n;i++){//输出闭合回路 if(listCount[i]>1) cout<<i<<" "; } return 0; }

答案解析

思路简介

首先根据题意了解到这是与数据结构中的树相关的问题,根据第一个输入画出一个树便可以很轻松的看到输出答案的闭合环路,但需要让计算机进行这一过程。

其次,我们可以观察到最后在环上的顶点,与之连接的至少有两个,所以我们可以采用记录每个顶点的连接数,然后去除掉连接个数为1的顶点树,再去掉与之连接的那条线,依次循环,最后输出时判断节点连接数为1的节点,便只剩下在环中的顶点,即答案。

在此使用可变数组与固定数组完成,一个记录节点,另外一个记录节点连接的个数,按照上面所述思想完成筛选过程,最后要求按照从小到大顺利输出,代码中直接判断节点连接个数就输出是因为固定数组中存储时已经按照顺序来存,不需要再进行排序操作,便可得到正确结果。

上一题 下一题