얼렁뚱땅 JAVA 알고리즘

[JAVA] 순서가 있는 트리에서 위상정렬

MOSTAR 2023. 3. 22. 16:49

 

단, 비순환 그래프임이 가정되어야 함.

 

import java.io.*;
import java.util.*;

public class 작업순서 {
	static ArrayList <Integer> as;
	static int n;
	static int m;
	static int [] visited;
	static int [] count;
	static ArrayList<Integer> [] al;
	
	public static void topo() {
		ArrayList <Integer> q = new ArrayList<>();
		for(int i=1;i<n+1;i++) {
			if(count[i]==0) {
				q.add(i);
				visited[i]=1;
			}
		}
		
		while(q.size()!=0) {
			int num = q.remove(0);
			as.add(num);
			
			for(int i=0;i<al[num].size();i++) {
				count[al[num].get(i)]-=1;
				if(count[al[num].get(i)]==0 && visited[al[num].get(i)]==0) {
					q.add(al[num].get(i));
					visited[al[num].get(i)]=1;
				}
			}
		}
	}
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for(int t=1;t<=10;t++) {
			String [] str= br.readLine().split(" ");
			n = Integer.parseInt(str[0]);
			m = Integer.parseInt(str[1]);
			
			al = new ArrayList[n+1];
			as = new ArrayList<>();
			
			for(int i=0;i<n+1;i++) {
				al[i] = new ArrayList<Integer>();
			}
			
			count = new int[n+1];
			visited = new int[n+1];
			
			String [] str_arr = br.readLine().split(" ");
			for(int i=0;i<2*m;i=i+2) {
				al[Integer.parseInt(str_arr[i])].add(Integer.parseInt(str_arr[i+1]));
				count[Integer.parseInt(str_arr[i+1])] += 1;
			}
			
			topo();
			System.out.print("#"+t);
			for(int i=0;i<as.size();i++) {
				System.out.print(" "+as.get(i));
			}
			System.out.println();
		}
		
	}

}