정올 #2462 백준 #2458 키 순서
그래프 DFS, 벡터 이용
처음에는 [등수를 알고싶은 학생][비교하는 학생(n명)] 이렇게 이차원 배열을 사용해야 한다고 생각했는데, 그냥 main에서 for문으로 n번 dfs를 돌리면 되는 일이었다.
#include <stdio.h>
#include <vector>
using namespace std;
int n, m, a, b;
vector<int> smaller[501]; //i보다 작은 사람들
vector<int> taller[501]; //i보다 큰 사람들
int chk_small[501], chk_tall[501]; int cnt;
void small(int now){
if(chk_small[now]) return; //방문했으면 return
chk_small[now] = 1; //방문처리
cnt++; //(cnt = 현재 아는 정보) +1
for(int x: smaller[now]){
small(x); //dfs
}
}
void tall(int now){
if(chk_tall[now]) return;
chk_tall[now] = 1;
cnt++;
for(int x: taller[now]){
tall(x);
}
}
//나눠서 DFS
int main(void){
scanf("%d %d", &n, &m);
for(int i = 0; i< m; i++){
scanf("%d %d", &a, &b);
smaller[b].push_back(a);
taller[a].push_back(b);
}
int ans = 0;
for(int i = 1; i<= n; i++){
cnt =0; //
for(int j = 1; j<= n; j++){
chk_small[j] = 0;
chk_tall[j] = 0;
}
tall(i); small(i);
if(cnt >= n+1) ans++;
//n명 중 나 빼고 n-1명의 키 정보를 알면 내 키 순서 를 알 수 있음
//chk_small(i), chk_tall(i) 돌릴 때 나의 키도 체크됨
//-> 각각 cnt +1 -> cnt>=n-1 + 2 기준
}
printf("%d", ans);
return 0;
}
Author And Source
이 문제에 관하여(정올 #2462 백준 #2458 키 순서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cirtuare/정올-3230-두-로봇저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)