알고리즘/백준(BOJ)
백준 - 케빈 베이컨의 6단계 법칙
시나모온
2020. 11. 25. 18:53
문제 링크입니다 : www.acmicpc.net/problem/1389
1389번: 케빈 베이컨의 6단계 법칙
첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻
www.acmicpc.net
bfs 구현 문제였다. 난이도는 매우 쉬움
#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
int N, M;
vector<vector<int>> adj;
vector<bool> visited;
int dfs(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
int ret = 0;
int dist = 1;
while(!q.empty()) {
int qSize = q.size();
for(int i = 0; i < qSize; i++) {
int cur = q.front();
q.pop();
for(int j = 0; j < adj[cur].size(); j++) {
int next = adj[cur][j];
if(visited[next]) continue;
visited[next] = true;
q.push(next);
ret += dist;
}
}
dist++;
}
return ret;
}
int main() {
cin >> N >> M;
adj.assign(N + 1, vector<int>());
int u, v;
for(int i = 0; i < M; i++) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int minVal = INF;
int minNum = 0;
for(int i = 1; i <= N; i++) {
visited.assign(N + 1, false);
int num = dfs(i);
if(num < minVal) {
minVal = num;
minNum = i;
}
}
cout << minNum;
return 0;
}
from collections import deque
N, M = map(int, input().split())
adj = [[] for _ in range(N + 1)]
visited = []
def dfs(start: int) -> int:
global visited
global adj
q = deque()
q.append(start)
visited[start] = True
ret = 0
dist = 0
while len(q) != 0:
dist += 1
q_size = len(q)
for i in range(q_size):
cur = q.popleft()
for j, n in enumerate(adj[cur]):
if visited[n]: continue
visited[n] = True
ret += dist
q.append(n)
return ret
for i in range(M):
u, v = map(int, input().split())
adj[u].append(v)
adj[v].append(u)
min_val = float('inf')
min_index = 0
for i in range(1, N + 1):
visited = [False] * (N + 1)
num = dfs(i)
if num < min_val:
min_val = num
min_index = i
print(min_index)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int N, M;
static ArrayList<ArrayList<Integer>> adj = new ArrayList<ArrayList<Integer>>();;
static ArrayList<Boolean> visited = new ArrayList<Boolean>();
static void setVisitedFalse() {
visited.clear();
for(int i = 0; i <= N; i++) {
visited.add(false);
}
}
static int dfs(int start) {
Queue<Integer> q = new LinkedList<Integer>();
q.add(start);
visited.set(start, true);
int ret = 0;
int dist = 0;
while(!q.isEmpty()) {
dist++;
int qSize = q.size();
for(int i = 0; i < qSize; i++) {
int cur = q.poll();
for(int j = 0; j < adj.get(cur).size(); j++) {
int next = adj.get(cur).get(j);
if(visited.get(next)) continue;
visited.set(next, true);
ret += dist;
q.add(next);
}
}
}
return ret;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
for(int i = 0; i <= N; i++) {
adj.add(new ArrayList<Integer>());
}
int u, v;
for(int i = 0; i < M; i++) {
u = sc.nextInt();
v = sc.nextInt();
adj.get(u).add(v);
adj.get(v).add(u);
}
int minVal = Integer.MAX_VALUE;
int minIndex = 0;
for(int i = 1; i <= N; i++) {
setVisitedFalse();
int num = dfs(i);
if(num < minVal) {
minVal = num;
minIndex = i;
}
}
System.out.println(minIndex);
bw.flush();
bw.close();
br.close();
}
}
개발 환경 : vscode, eclipse 2020-03, C++ 11, Python3, Java 11
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~