解题思路:
注意事项:
参考代码:
package Year_2017;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class 发现环 {
private static int index = 0;
private static int[] arr,visited;
private static Map<Integer,ArrayList<Integer>> map = new HashMap<Integer,ArrayList<Integer>>();
private static ArrayList<Integer> res = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
arr = new int [n+1];
visited = new int [n+1];
for(int i=1;i<=n;i++) {
//给结点编一个默认号
arr[i] = i;
}
for(int i=1;i<=n;i++) {
int u_head = sc.nextInt();
int v_tail = sc.nextInt();
if(map.get(u_head) == null) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(v_tail);
map.put(u_head, list);
}else { //如果u_head不为空
ArrayList<Integer> list = map.get(u_head);
list.add(v_tail);
map.put(u_head, list);
}
//================================================================
if(map.get(v_tail) == null) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(u_head);
map.put(v_tail, list);
}else { //如果u_head不为空
ArrayList<Integer> list = map.get(v_tail);
list.add(u_head);
map.put(v_tail, list);
}
//================================================================
//构造一个find,查看当前的值,有没有出现过
int x = find(u_head) ,y = find(v_tail);
if(x != y) {
arr[x] = y;
}else {
index = u_head;
dfs(u_head);
}
}//for(int i=1;i<=n;i++)
Collections.sort(res);
for(int i=0;i<res.size();i++) {
System.out.print(res.get(i));
if(i<res.size()-1) {
System.out.print(" ");
}else {
System.out.println();
}
}
}
sc.close();
}
private static boolean dfs(int x) {
// TODO Auto-generated method stub
if(visited[x] == 1) {
if(x==index) {
return true;
}
return false;
}
visited[x] = 1;
for(int i=0;i<map.get(x).size();i++) {
int v = map.get(x).get(i);
if(dfs(v)) {
res.add(v);
return true;
}
}
return false;
}
private static int find(int x) {
// TODO Auto-generated method stub
if(x == arr[x]) {
return x;
}else {
arr[x] = find(arr[x]);
return arr[x];
}
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复