처음에는 위상정렬인가 생각했다. 위상정렬로 어떻게 하지 생각하다가 필요없단 걸 깨달았다.
한 소가 나머지 소들과 한번씩 붙어봤다면 (모두를 알면) 자신의 순위를 알 수 있다.
소를 하나의 정점으로 생각하면 어떤 한 정점과 연결된 선의 갯수가 V-1(자신을 제외한 나머지)개 라면 순위를 알 수 있다.
들어오는 간선(indegree) + 나가는 간선(outdegree) = V-1 (문제에선 N-1) 이면 된다. 정점끼리 서로 연결되었는 지는 방향 그래프를 유지해야하고, 셀 때만 구분없이 세면 된다.
7 6 4 3 3 2 1 2 2 5 5 6 5 7
는 2번 소, 5번 소 = 2개 가 나와야 한다.
#include <bits/stdc++.h> using namespace std; int main(){ int i, j, k, N, M; scanf("%d %d", &N, &M); bool determine[100][100]={}; while(M--){ int s, e; scanf("%d %d ", &s, &e); determine[s-1][e-1] = true; } for(k=0; k<N; ++k) for(i=0; i<N; ++i) for(j=0; j<N; ++j) determine[i][j] |= determine[i][k] && determine[k][j]; int ans = 0; for(i=0; i<N; ++i){ int cnt = 0; for(j=0; j<N; ++j){ if(i==j) continue; cnt += determine[i][j] || determine[j][i]; } ans += cnt == N-1; } printf("%d", ans); return 0; }
댓글 없음:
댓글 쓰기