티스토리 뷰
https://www.acmicpc.net/problem/2660
2660번: 회장뽑기
입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터
www.acmicpc.net

문제
월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모임은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알 수 있다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다.
예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나 친구의 친구임을 말한다. 또한 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친구의 친구의 친구임을 말한다.
4점, 5점 등은 같은 방법으로 정해진다. 각 회원의 점수를 정할 때 주의할 점은 어떤 두 회원이 친구사이이면서 동시에 친구의 친구사이이면, 이 두사람은 친구사이라고 본다.
회장은 회원들 중에서 점수가 가장 작은 사람이 된다. 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램을 작성하시오.
유형 : 다익스트라
접근
- 친구 간의 경로에 있어 선의 개수 = 친구 점수 ( 낮은거 우선)
- 즉 다익스트라를 통해 dis(거리) 배열에 친구 점수를 기입하면 된다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n = 0;
static ArrayList<Integer>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
graph = new ArrayList[n+1];
for(int i=1;i<=n;i++){
graph[i] = new ArrayList<>();
}
while(true) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
if(x == -1 && y == -1)
break;
graph[x].add(y);
graph[y].add(x);
}
int min = 51;
int count = 0;
ArrayList<Integer> list = new ArrayList<>();
for(int i=1;i<=n;i++){
int tmp = search(i);
if(min > tmp){
count = 1;
list.clear();
list.add(i);
min = tmp;
}
else if(min == tmp){
count += 1;
list.add(i);
}
}
StringBuilder sb = new StringBuilder();
sb.append(min+" "+count+"\n");
for(int tmp : list){
sb.append(tmp+" ");
}sb.append("\n");
System.out.print(sb);
}
static int search(int start){
int[] dis = new int[n+1];
PriorityQueue<Node> pq = new PriorityQueue<>(
(x,y) -> x.c - y.c
);
for(int i=1;i<=n;i++)
{
dis[i] = 51;
if(i == start)
dis[i] = 0;
}
pq.add(new Node(start,0));
while(!pq.isEmpty()){
Node cur = pq.poll();
for(int next : graph[cur.v]){
if(dis[next] > dis[cur.v] + 1){
dis[next] = dis[cur.v] + 1;
pq.add(new Node(next,dis[next]));
}
}
}
int max = 0;
for(int i=1;i<=n;i++){
max = Math.max(max,dis[i]);
}
return max;
}
}
class Node{
int v;
int c;
Node(int v,int c){
this.v = v;
this.c = c;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 3649 (로봇 프로젝트) - java (1) | 2023.10.02 |
|---|---|
| 백준 16562 (친구비) - java (1) | 2023.10.01 |
| 백준 1948 (임계경로) - java (0) | 2023.09.28 |
| 백준 2268 (수들의 합 7) - java (1) | 2023.09.28 |
| 백준 17396 (백도어) - java (0) | 2023.09.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 올해보다
- 백준 #1987 #알파벳 #자바 #java
- 자바
- 백준 #
- 백준 #2636 #치즈
- 백준 #2580 #스도쿠
- 17394
- Java
- 백준 #1759 #암호 만들기
- 백준 #12014 #주식 #자바 #java
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 자바 #JAVA
- 백준 #치즈 #2638
- 17218
- 백준 #16973 #직사각형 탈출
- 백준 #18405 #경쟁적 전염
- 백준 #13549 #숨바꼭질3
- 백준
- 백준 #4963 #섬의 개수
- 백준 #3980 #선발 명단
- 백준 #1584 #게임 #java #자바
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #1325 #효율적인 해킹
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 행복합시다.
- 백준 #다리 만들기 #2146
- 백준 #인구 이동 #16234
- 백준 #17940 #주식 #자바 #java
- 백준 #15686 #치킨 배달
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
글 보관함