更多JAVA版答案移步我的博客:蓝桥杯JAVA版答案汇总
本题考查
可以用拓扑排序的思路、也可以用并查集加DFS
但无论是哪种思路都无法得满分
思路
读取完数据后,每次循环将度为1的结点加入队列,并标记已经访问,将与该结点邻接的所有结点度减一,继续循环,当队列内元素为空,也就是再也没有度为1的结点时结束循环,所有未访问过的结点就在环中。
原因,环中虽有元素度至少为2,不可能小于2,所以当把某些非环中结点删除以后,环中结点的度也不会小于2。
30分代码
java后面的用例无法运行的原因,java无法建立十万个元素的数据结构,所以这个题用java可能无法得到满分
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
static int[][] matrix;
static int[] degree;
static boolean[] visit;
static void topology() {
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 1; i < degree.length; i++)
if(degree[i]==1) {list.add(i); visit[i]=true;}
while(!list.isEmpty()) {
int temp = list.pop();
degree[temp] = 0;
for(int i = 1; i < degree.length; i++) {
if(!visit[i] && matrix[temp][i]==1) degree[i]--;
if(!visit[i] && degree[i]==1) {list.add(i); visit[i]=true;}
}
}
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int round = scaner.nextInt();
matrix = new int[round+1][round+1];
degree = new int[round+1];
visit = new boolean[round+1];
for (int i = 0; i < round; i++) {
int temp1=scaner.nextInt();
int temp2=scaner.nextInt();
degree[temp1]++;degree[temp2]++;
matrix[temp1][temp2] = matrix[temp2][temp1] = 1;
}
String result = "";
topology();
for (int i = 1; i < degree.length; i++) if(degree[i]>1) result+=i+" ";
System.out.println(result.trim());
scaner.close();
}
}