Skip to content

Commit e1cc7ef

Browse files
committed
[Gold V] Title: 회장뽑기, Time: 132 ms, Memory: 15904 KB -BaekjoonHub
1 parent 57af1d2 commit e1cc7ef

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold V] 회장뽑기 - 2660
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2660)
4+
5+
### 성능 요약
6+
7+
메모리: 15904 KB, 시간: 132 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색, 최단 경로, 플로이드–워셜
12+
13+
### 제출 일자
14+
15+
2025년 9월 15일 10:40:29
16+
17+
### 문제 설명
18+
19+
<p>월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모임은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알 수 있다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다.</p>
20+
21+
<p>예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나 친구의 친구임을 말한다. 또한 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친구의 친구의 친구임을 말한다.</p>
22+
23+
<p>4점, 5점 등은 같은 방법으로 정해진다. 각 회원의 점수를 정할 때 주의할 점은 어떤 두 회원이 친구사이이면서 동시에 친구의 친구사이이면, 이 두사람은 친구사이라고 본다.</p>
24+
25+
<p>회장은 회원들 중에서 점수가 가장 작은 사람이 된다. 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램을 작성하시오.</p>
26+
27+
### 입력
28+
29+
<p>입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.</p>
30+
31+
### 출력
32+
33+
<p>첫째 줄에는 회장 후보의 점수와 후보의 수를 출력하고, 두 번째 줄에는 회장 후보를 오름차순으로 모두 출력한다.</p>
34+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
public static void main(String[] args) throws Exception {
7+
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
10+
int N = Integer.parseInt(br.readLine());
11+
12+
int dist[][] = new int[N+1][N+1];
13+
final int INF = 1_000_000;
14+
for(int i =1; i<=N; i++) {
15+
Arrays.fill(dist[i], INF);
16+
dist[i][i] = 0;
17+
}
18+
19+
while(true) {
20+
StringTokenizer st = new StringTokenizer(br.readLine());
21+
22+
int start =Integer.parseInt(st.nextToken());
23+
int end = Integer.parseInt(st.nextToken());
24+
if(start == -1 && end == -1) {
25+
break;
26+
}
27+
dist[start][end] = 1;
28+
dist[end][start] = 1;
29+
}
30+
31+
for(int k = 1; k<=N; k++) {
32+
for(int i =1; i<=N; i++) {
33+
for(int j = 1; j<=N; j++) {
34+
if(dist[i][j] > dist[i][k] + dist[k][j]) {
35+
dist[i][j] = dist[i][k] + dist[k][j];
36+
}
37+
}
38+
}
39+
}
40+
int score[] = new int[N+1];
41+
42+
int best = INF;
43+
44+
for(int i =1;i <=N; i++) {
45+
int cur = 0;
46+
for(int j =1; j<=N; j++) {
47+
cur = Math.max(cur, dist[i][j]);
48+
}
49+
score[i] = cur;
50+
best = Math.min(cur, best);
51+
}
52+
53+
List<Integer> list = new ArrayList<>();
54+
55+
for(int i =1; i<=N; i++) {
56+
if(score[i] == best) {
57+
list.add(i);
58+
}
59+
}
60+
61+
System.out.println(best +" " + list.size());
62+
for(int i = 0; i <list.size(); i++) {
63+
System.out.print(list.get(i));
64+
if (i != list.size()-1) {
65+
System.out.print(" ");
66+
}
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)