package tt;
import java.util.*;
public class Linjiebiao {
public static void main(String args[]) {
Scanner in=new Scanner(System.in);
while(in.hasNext()) {
int n=in.nextInt();
int m=in.nextInt();
int du[]=new int[n+1];
List<ArrayList<Integer>> map=new ArrayList<ArrayList<Integer>>(); //使用嵌套的list存储关系矩阵,对于稀疏矩阵来说很节省空间
//初始化map,全是空
for(int i=0;i<=n;i++) {
map.add(new ArrayList());
}
//对输入的关系矩阵做处理
for(int i=1;i<=m;i++) {
int x=in.nextInt();
int y=in.nextInt();
List temp=map.get(x);
int flag=1;
for(int j=0;j<temp.size();j++) {
if((int)temp.get(j)==y) {
flag=0;
break;
}
}
if(flag==1) {
temp.add(y);
du[y]+=1;
map.set(x,new ArrayList(temp));//更新原来的状态值,注意此处使用list.set(index,value)函数,更新了index处的索引
}
}
//拓扑排序
int cnt=0;
Queue<Integer> queue=new LinkedList<Integer>();
Queue<Integer> ans=new LinkedList<Integer>();
for(int i=1;i<=n;i++) {
if(du[i]==0) {
queue.add(i);
ans.add(i);
du[i]=-1;
cnt++;
}
}
while(queue.size()>0) {
int tnum=(int)queue.poll();
List tlist2=map.get(tnum);
for(int i=0;i<tlist2.size();i++) {
du[(int)tlist2.get(i)]--;
}
for(int i=1;i<=n;i++) {
if(du[i]==0) {
queue.add(i);
ans.add(i);
du[i]=-1;
cnt++;
}
}
}
if(cnt!=n) {
System.out.println("存在环");
}else {
int flag2=1;
while(ans.size()>0) {
if(flag2==1) {
System.out.print(ans.poll());
}else {
System.out.print(" "+ans.poll());
}
System.out.println();
}
}
}
}
}
拓扑排序使用List<List>存储关系,即稀疏矩阵
最新推荐文章于 2021-01-15 03:22:01 发布