题目链接:http://lx.lanqiao.cn/problem.page?gpid=T453

问题描述

  小明的实验室有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
 
解题思路:第一种解法是用拓扑排序的方式,把度数为1的点去掉,然后剩下的度数为2的点就是答案了,第二种解法是用并查集找到环上相邻的两个点,然后用dfs一个为起点一个为终点,就可以搜索出答案。
代码:
第一种解法:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
int n,tot,head[maxn],in[maxn];
vector<int> ans;
struct node{
int to,next;
}edge[*maxn];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void topsort(){
queue<int> que;
for(int i=;i<=n;i++){
if(in[i]==)que.push(i);
}
while(que.size()){
int now=que.front();
que.pop();
for(int i=head[now];i!=-;i=edge[i].next){
int v=edge[i].to;
in[v]--;
if(in[v]==)que.push(v);
}
}
for(int i=;i<=n;i++){
if(in[i]==)ans.push_back(i);
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++)head[i]=-;
for(int i=;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
in[u]++; in[v]++;
}
topsort();
sort(ans.begin(),ans.end());
for(int i=;i<ans.size();i++)
{
printf("%d",ans[i]);
if(i!=ans.size()-)cout<<" ";
else cout<<endl;
}
return ;
}

第二种解法:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
int n,tot,st,ed,head[maxn],par[maxn],pre[maxn],vis[maxn];
vector<int> ans;
struct node{
int to,next;
}edge[*maxn];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int find(int x){
if(x==par[x])return x;
else return par[x]=find(par[x]);
}
void unite(int x,int y){
int fx=find(x),fy=find(y);
par[fx]=fy;
}
void dfs(int x){
vis[x]=;
for(int i=head[x];i!=-;i=edge[i].next){
int v=edge[i].to;
if(!vis[v]){
if(x==st&&v==ed)continue;
vis[v]=;
pre[v]=x;
if(v==ed)return;
dfs(v);
}
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++){
head[i]=-;
par[i]=i;
}
for(int i=;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
if(find(u)!=find(v))unite(u,v);
else{
st=u;
ed=v;
}
}
pre[st]=st;
dfs(st);
int tmp=ed;
ans.push_back(ed);
while(pre[tmp]!=tmp){
tmp=pre[tmp];
ans.push_back(tmp);
}
sort(ans.begin(),ans.end());
for(int i=;i<ans.size();i++)
{
printf("%d",ans[i]);
if(i!=ans.size()-)cout<<" ";
else cout<<endl;
}
return ;
}

发现环 (拓扑或dfs)的更多相关文章

  1. 蓝桥杯 试题 历届试题 发现环 并查集+dfs

    问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使 ...

  2. 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径

    什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...

  3. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

  4. 拓扑排序-DFS

    拓扑排序的DFS算法 输入:一个有向图 输出:顶点的拓扑序列 具体流程: (1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v] (2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面 (3 ...

  5. 发现环——第八届蓝桥杯C语言B组(国赛)第四题

    原创 标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台 电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管 ...

  6. 2017第八届蓝桥杯决赛(C++ B组)4.发现环

    描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操作使得某 ...

  7. HDU 3342 Legal or Not(有向图判环 拓扑排序)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. 拓扑排序+DFS(POJ1270)

    [日后练手](非解题) 拓扑排序+DFS(POJ1270) #include<stdio.h> #include<iostream> #include<cstdio> ...

  9. 第八届蓝桥杯C/C++程序设计本科B组决赛 ——发现环(编程大题_签到题_tarjan判环)

    标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操 ...

随机推荐

  1. java 工具

    JClassLib 4.2 发布了,该版本支持 Java 7 和 Java 8 的类文件属性查看. JClassLib不但是一个字节码阅读器而且还包含一个类库允许开发者读取,修改,写入Java Cla ...

  2. Bootstrap知识记录:排版样式

    ---恢复内容开始--- 一.页面排版Bootstrap 提供了一些常规设计好的页面排版的样式供开发者使用.1.页面主体Bootstrap 将全局font-size 设置为14px,line-heig ...

  3. Oracle通过ROWID删除表中重复记录

    -- 1 通过ROWID删除T1表里重复的记录    SELECT ROWID,A,B--DELETE FROM  T1WHERE ROWID IN (  SELECT RD  FROM  (     ...

  4. jenkins配置SSH远程服务器连接

    之前用jenkins做了一个自动发布测试,配置任务的Post Steps时,选择的是执行shell命令.如下图: 这是在本192.168.26.233服务器上测试的,此服务器上运行jenkins,to ...

  5. MyBatis映射文件5

    返回map     Map<String,Object> getEmpByResMap(Integer id); <select id="getEmpByResMap&qu ...

  6. MySQL系列:视图基本操作(3)

    1. 视图简介 1.1 视图定义 视图是一种虚拟的表,是从数据库中一个或多个表中导出来的表. 视图可以从已存在的视图的基础上定义. 数据库中只存放视图的定义,并没有存放视图中的数据,数据存放在原来的表 ...

  7. Hack You CTF 2014: NotEasyTask

    exe文件,运行后闪退,peid查一下,发现是是c#写的 Reflector打开 找到Main: private static void Main(string[] args) { string ho ...

  8. Reversing-x64Elf-100

    一道很简单的小题 作为python小白这道题主要是学习了一点python知识...... 可以看出来 sub_4006FD 这个函数是用来判断输入密码是否正确的 我们看一下它的伪代码: signed ...

  9. Python——Flask框架——Web表单

    一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...

  10. Lodop导出图片和打印机无关,测试是否有关

    Lodop导出的图片,既可以在预览界面另存为,也可以用语句导出.语句导出,可查看本博客的相关博文:Lodop导出图片,导出单页内容的图片 预览的时候,由于选择的打印机不同,而真实的打印机可能有不同的可 ...