풀이
모든 노드에서 dfs를 정방향으로 한 번, 역방향으로 한 번 돌려주자!
정방향은 나보다 큰 친구들, 역방향은 나보다 큰 친구들의 개수(?)이다.
이 둘을 합한 값이 나를 제외한 n-1명과 같은지 알아보자!
코드
#include <bits/stdc++.h>
using namespace std;
int n, m, t, vst[2][501];
vector<int> gph[2][501];
int dfs(int now) {
int ret = 1; vst[t][now] = 1;
for (int nxt : gph[t][now]) if (!vst[t][nxt]) ret += dfs(nxt);
return ret;
}
int main() {
int u, v;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", &u, &v);
gph[0][u].push_back(v), gph[1][v].push_back(u);
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
memset(vst, 0, sizeof(vst));
t = 0, u = dfs(i);
t = 1, v = dfs(i);
if (u + v - 1 == n) cnt++;
}
printf("%d", cnt);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이