한양대학교 ERICA 알고리즘 연구학회 영과일의 내부 대회 "ZOAC 2019"의 문제 출제 및 검수를 맡게 되었습니다.
그중 F번 문제인 Small World Network에 대한 풀이입니다.
목표

2019-2학기 김태형교수님의 "소셜 네트워크 분석"이라는 수업을 들으면서 배웠던 내용을 문제로 만들어 보았습니다. Small World Network란 이론에서 실제 실험 값의 평균이 6에 수렴하더라 라는 수업 내용을 듣고 친구 관계 네트워크가 주어졌을 때 이 네트워크가 Small World Network가 만족하는지 확인하는 문제입니다.
이 문제를 해결하기 위한 조건은 이렇습니다.
- 모든 노드들에 대해서 한 노드에서 어떤 노드로 가는 방법이 6단계 이하여야 한다.
즉 1~N까지 모든 노드들을 탐색하면서 해당 노드와 다른 모든 노드들이 6단계 이하로 연결되어 있어야 한다는 것입니다.
저는 이 문제를 BFS를 통해 해결하였지만 플로이드-워샬 알고리즘을 통해서도 해결할 수 있습니다.
이 문제의 시간 복잡도는 O(모든 노드(N) * BFS(N)) == O(N2) 입니다.
코드
더보기
C++
#include <bits/stdc++.h>
using namespace std;
vector <vector<int> > node(101); // 노드의 개수
int chk[101];
void bfs(int n){ // BFS 따로 BFS에 대해선 설명하지 않겠습니다.
int fn;
queue <int> q;
chk[n] = 0;
q.push(n);
while(!q.empty()){
fn = q.front();
q.pop();
for(int i = 0; i < node[fn].size(); i++){
if(chk[node[fn][i]] == -1){
q.push(node[fn][i]);
chk[node[fn][i]] = chk[fn] + 1;
}
}
}
}
int main(){
int N, K; cin >> N >> K;
for(int i = 0; i < K; i++){ // 친구관계 형성
int a, b; scanf("%d%d", &a, &b);
node[a].push_back(b);
node[b].push_back(a);
}
for(int i = 1; i <= N; i++){
memset(chk, -1, sizeof(chk)); // 노드를 탐색할 때 마다 노드 초기화
bfs(i); // BFS
for(int j = 1; j <= N; j++){
if(chk[j] == -1 || chk[j] > 6){ // 노드가 이어져있지 않거나, 6보다 많은 단계로 연결되어 있으면
printf("Big World!\n");
return 0;
}
}
}
printf("Small World!\n");
}
'Coding' 카테고리의 다른 글
[BOJ][ZOAC 2019]18244번 - 변형 계단 수 (0) | 2019.12.30 |
---|---|
[BOJ][ZOAC 2019]18238번 - ZOAC 2 (0) | 2019.12.30 |
2018.04.18 1st Semester 한양대 에리카 자료구조 과제 LinkedStack, LinkedQueue (1) | 2018.04.18 |
2018.04.03 1st Semester 한양대 에리카 자료구조 과제 DoublyLinkedList (0) | 2018.04.18 |
2018.03.28 1st Semester 한양대 에리카 자료구조 과제 SinglyLinkedList (0) | 2018.03.29 |