图论:拓扑排序
import java.util.*;
public class Main {
static Scanner in=new Scanner(System.in);
public static void main(String[] args) {
int n,m;
n=in.nextInt();
m=in.nextInt();
int []inDegree=new int[n+1];
List<List<Integer>> umap=new ArrayList<>();
for (int i = 0; i < n; i++) {
umap.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
int s,t;
s=in.nextInt();
t=in.nextInt();
//记录s指向的节点有哪些,然后让t入度自增
umap.get(s).add(t);
inDegree[t]++;
}
//把入度为0的点都加入队列
Deque<Integer> queue=new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (inDegree[i]==0){
queue.offer(i);
}
}
List<Integer>result=new ArrayList<>();
//遍历队列
while (!queue.isEmpty()){
//加入结果
int cur=queue.poll();
result.add(cur);
//获取当前节点指向的节点,并把指向节点的入度减一,如果入度为0加入队列
for (Integer i : umap.get(cur)) {
inDegree[i]--;
if (inDegree[i]==0){
queue.offer(i);
}
}
}
//如果有节点没有加入,说明成环无答案
if (result.size()!=n){
System.out.println(-1);
return;
}
System.out.print(result.get(0));
for (int i = 1; i <result.size() ; i++) {
System.out.print(" "+result.get(i));
}
}
}
public class Main {
static Scanner in=new Scanner(System.in);
public static void main(String[] args) {
int n,m;
n=in.nextInt();
m=in.nextInt();
int []inDegree=new int[n+1];
List<List<Integer>> umap=new ArrayList<>();
for (int i = 0; i < n; i++) {
umap.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
int s,t;
s=in.nextInt();
t=in.nextInt();
//记录s指向的节点有哪些,然后让t入度自增
umap.get(s).add(t);
inDegree[t]++;
}
//把入度为0的点都加入队列
Deque<Integer> queue=new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (inDegree[i]==0){
queue.offer(i);
}
}
List<Integer>result=new ArrayList<>();
//遍历队列
while (!queue.isEmpty()){
//加入结果
int cur=queue.poll();
result.add(cur);
//获取当前节点指向的节点,并把指向节点的入度减一,如果入度为0加入队列
for (Integer i : umap.get(cur)) {
inDegree[i]--;
if (inDegree[i]==0){
queue.offer(i);
}
}
}
//如果有节点没有加入,说明成环无答案
if (result.size()!=n){
System.out.println(-1);
return;
}
System.out.print(result.get(0));
for (int i = 1; i <result.size() ; i++) {
System.out.print(" "+result.get(i));
}
}
}
全部评论
相关推荐
02-12 17:29
莆田学院 Java 点赞 评论 收藏
分享
查看24道真题和解析