本题考查
图的拓扑排序
思路
思路一:建立存储结点入度的数组,每次判断都为有一条起点为该点的边的终点入度减一
思路二:建立存储结点前驱节点的数组,每次判断当前队列是否包含该结点所有的前驱结点
PS:本题并不困难,写在这里主要想提醒自己,本体需要判断的序列一定长度为6,不管该序列是不是拓扑排序序列都需要读完这几个数,不能提前退出,所以在判断该队列不属于拓扑排序后不能跳出循环,还需要继续将剩下几个数读完。
代码(最后一个用例超时)
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int nodeNum = scaner.nextInt();
int edgeNum = scaner.nextInt();
@SuppressWarnings("unchecked")
LinkedList<Integer>[] pre = new LinkedList[nodeNum+1];
for(int i = 1 ; i < nodeNum + 1 ; i++)
pre[i] = new LinkedList<Integer>();
for (int i = 0; i < edgeNum; i++) {
int start = scaner.nextInt();
int end = scaner.nextInt();
pre[end].add(start);
}
int round = scaner.nextInt();
String result = "";
LinkedList<Integer> seq = new LinkedList<Integer>();
for (int i = 0; i < round; i++) {
seq.clear();
boolean flag = true;
for(int j = 0 ; j < nodeNum ; j++) {
int current = scaner.nextInt();
if(flag && !seq.containsAll(pre[current])) {
result += i + " ";
flag = false;
}
seq.add(current);
}
}
scaner.close();
System.out.println(result.trim());
}
}