728x90
시간 제한 : 1초
메모리 제한 : 128MB
입력
첫째 줄에 학생들의 수 N (2<=N<=500)과 두 학생 키를 비교한 횟수 M (0<=M<=N(N-1)/2)이 주어진다. 다음 M개의 각 줄에는 두 학생의 키를 비교한 결과를 나타내는 두 양의 정수 a와 b가 주어진다. 이는 번호가 a인 학생이 번호가 b인 학생보다 키가 작은 것을 의미한다.
출력
자신이 키가 몇 번째인지 알 수 있는 학생이 모두 몇 명인지를 출력한다.
소스코드
#include <iostream> #define INF 1000000000 using namespace std; int graph[500][500], n; void Floyd() { for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (graph[i][k] == 1 && graph[k][j] == 1) graph[i][j] = 1; } int main(void) { int m, v1, v2, w, cnt, ans; cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) graph[i][j] = 0; cin >> m; for (int i = 0; i < m; i++) { cin >> v1 >> v2; graph[v1 - 1][v2 - 1] = 1; } Floyd(); ans = 0; for (int i = 0; i < n; i++) { cnt = 0; for (int j = 0; j < n; j++) if (i != j) cnt += (graph[i][j] + graph[j][i]); if (cnt == n - 1) ans++; } cout << ans; }
Tip
플로이드-워셜 알고리즘을 이용하면 된다. 경로 구축만 되는지를 체크하면서 풀면 된다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 2037 - 문자메세지(ACM-ICPC Regionals) (0) | 2018.05.05 |
---|---|
백준] 1356 - 유진수 (0) | 2018.04.23 |
백준] 14501 - 퇴사 (0) | 2018.04.21 |
백준] 5212 - 지구 온난화(COCI 2012/2013) (0) | 2018.04.20 |
백준] 11403 - 경로 찾기 (0) | 2018.04.18 |