https://www.acmicpc.net/problem/2252
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
N명의 학생들 중 두 명의 쌍에 대하여
어느 학생이 더 왼쪽에 서야 하는지 제시한다.
가능한 경우의 수들 중 하나를 임의로 출력한다.
거꾸로 해석하면, 어느 학생에 대하여
그 학생보다 왼쪽에 있는 모든 학생이 출력되어야 해당 학생을 출력한다!
바로 위상 정렬이다.
import java.util.*;
import java.io.*;
public class g3_2252 {
static FastScanner fs = new FastScanner();
static PrintWriter pw = new PrintWriter(System.out);
static List<List<Integer>> list = new ArrayList<>();
static boolean[] visit, task;
public static void main(String[] args) {
int n = fs.nextInt(), m = fs.nextInt();
visit = new boolean[n + 1];
task = new boolean[n + 1];
for (int i=0;i<=n;i++) list.add(new ArrayList<>());
for (int i=0;i<m;i++){
int l = fs.nextInt(), r = fs.nextInt();
list.get(r).add(l);
task[l] = true;
}
for (int i=1;i<=n;i++){
if (!task[i]){
visit[i] = true;
solve(i);
}
}
pw.close();
}
static void solve(int now){
for (Integer i : list.get(now)){
if (!visit[i]){
visit[i] = true;
solve(i);
}
}
pw.print(now + " ");
}
// ----------input function----------
static void sort(int[] a) {
ArrayList<Integer> L = new ArrayList<>();
for (int i : a)
L.add(i);
Collections.sort(L);
for (int i = 0; i < a.length; i++)
a[i] = L.get(i);
}
static class FastScanner {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer("");
String next() {
while (!st.hasMoreTokens()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
int[] readArray(int n) {
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = nextInt();
return a;
}
long nextLong() {
return Long.parseLong(next());
}
}
}
'PS > Problems' 카테고리의 다른 글
[Java] 백준 9466번 텀 프로젝트 - DP, case work (0) | 2022.02.11 |
---|---|
[Java] 백준 7579번 앱 - 배낭 문제 응용 (0) | 2022.02.09 |
[Java] 백준 9252번 LCS 2 - LCS (0) | 2022.02.08 |
[Java] 백준 1806번 부분합 - 투 포인터 (0) | 2022.02.06 |
[Java] 백준 1208번 부분수열의 합 2 - 투 포인터 / Int, Long 혼용 주의! (0) | 2022.02.06 |