这个题是一道很明显的拓扑序列入门题,直接套用拓扑序列模板即可。依次删除掉入度为0的结点并输出即可AC。
先找到一个入度为0的结点,然后删除它,并把它所有后继结点的入度减一,依次类推下去。直到找不到入度为0的结点或是所有点都删除完
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
private int N;
private Graph g;
private Scanner in;
private List<Integer> list;
public Main() {
in = new Scanner(System.in);
N = in.nextInt();
g = new Graph(N);
list = new ArrayList<Integer>();
for (int start = 1; start <= N; start++) {
int end;
while ((end = in.nextInt()) != 0) {
g.createAdj(start, end);
}
}
bfs();
for(int i=0;i<list.size();i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
}
//关键代码,用bfs实现的
private void bfs() {
//会bfs的人应该都知道,bfs是用队列来实现的
Deque<Integer> queue = new LinkedList<Integer>();
//将入度为0的结点保存到队列中
for (int i = 1; i <= g.vertexNum; i++) {
if (g.inDeg[i] == 0) {
queue.offer(i);
}
}
//删除入度为0的结点并把它的后继结点入度减一
while (!queue.isEmpty()) {
int vertex = queue.poll();
//保存拓扑序列的各个点
list.add(vertex);
for (int i = 0; i < g.adjacency[vertex].size(); i++) {
int u = g.adjacency[vertex].get(i);
if (--g.inDeg[u] == 0) {
queue.offer(u);
}
}
}
}
public static void main(String[] args) {
new Main();
}
}
//创建一个图的数据结构
class Graph {
//图的顶点数
int vertexNum;
//各个定点的名称
int[] vertex;
//邻接表
List<Integer>[] adjacency;
//各个顶点的入度,方便在构建拓扑序列的时候使用
int[] inDeg;
public Graph(int vertexNum) {
this.vertexNum = vertexNum;
vertex = new int[vertexNum + 1];
adjacency = new List[vertexNum + 1];
inDeg = new int[vertexNum + 1];
for (int i = 1; i <= vertexNum; i++) {
vertex[i] = i;
adjacency[i] = new LinkedList<Integer>();
}
}
void createAdj(int start, int end) {
//创建邻接表
adjacency[start].add(end);
//标记入度
inDeg[end]++;
}
}