2458번 - 키순서
플로이드 알고리즘 문제. N제한이 500이라 시간 초과가 뜨지 않도록 아래부분도 추가했다.
ios::sync_with_stdio(false);
cin.tie(NULL);
로직은
나보다 키 큰 사람의 숫자, 나보다 키 작은 사람의 숫자가 총 인원과 같으면 나의 키를 알 수 있다.
따라서 플로이드 알고리즘으로 D배열을 구한 뒤,
나보다 키 큰 사람의 숫자 = D[나][다른사람]
나보다 키 작은 사람의 숫자 = D[다른사람][나]
일 때 마다 숫자를 세서 문제를 풀면 된다.
<정답 코드>
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include<iostream> #include<vector> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(NULL); //freopen("input.txt", "r", stdin); int n, m; cin >> n >> m; vector<vector<bool>> D(n + 1, vector<bool>(n + 1, false)); for (int i = 1; i <= n; i++) { D[i][i] = true; } while (m--) { int a, b; cin >> a >> b; D[a][b] = true; } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { D[i][j] = D[i][j] || (D[i][k] && D[k][j]); } } } int cnt = 0; vector<int> check(n + 1,0); for (int from = 1; from <= n; from++) { for (int to = 1; to <= n; to++) { if (D[from][to]) { check[from]++; continue; } if (D[to][from]) { check[from]++; continue; } } } for (int i = 1; i <= n; i++) { if (check[i] == n) { cnt++; } } cout << cnt << "\n"; return 0; } | cs |
반응형