문제: icpc.me/2252
N명이 학생이 주어지고 두 학생의 키를 비교한 M개의 정보가 주어질 때 줄을 세운 결과를 출력하는 문제이다.
우리는 두 학생의 우선관계를 방향 그래프를 이용하여 설정해준 뒤 topology를 구해주면 된다.
즉 DFS를 돌리면서 먼저 끝나는 순서대로 스택에 저장해준 뒤 하나씩 뽑으면서 출력해주면 답을 얻을 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <cstdio> #include <algorithm> #include <vector> #include <stack> #define MAX_N 32000 using namespace std; vector<vector<int>> vt; stack<int> st; int n, m, x, y, visited[MAX_N + 1]; void dfs(int v) { visited[v] = true; for (auto i : vt[v]) { if (visited[i]) continue; dfs(i); } st.push(v); } int main() { scanf("%d%d", &n, &m); vt.resize(n + 1); for (int i = 0; i < m; i++) { scanf("%d%d", &x, &y); vt[x].push_back(y); } for (int i = 1; i <= n; i++) { if (!visited[i]) dfs(i); } while (st.size()) { printf("%d ", st.top()); st.pop(); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)1049 기타줄 (0) | 2017.01.14 |
---|---|
BOJ)2022 사다리 (2) | 2017.01.14 |
BOJ)1561 놀이 공원 (0) | 2017.01.14 |
BOJ)1666 최대 증가 직사각형 집합 (2) | 2017.01.14 |
BOJ)3392 화성 지도 (1) | 2017.01.13 |