Home G21278. 호석이 두마리 치킨
Post
Cancel

G21278. 호석이 두마리 치킨

문제

image


제출 코드

image


  • 사용 알고리즘 : 그래프, BFS, 조합


모든 치킨집 조합에 대해 최소거리 합을 구해주면 되는 문제이다.

comb() : 전체 건물에서 치킨집을 차릴 건물을 선택하고,

bfs() : 각 치킨집에서부터 bfs로 나머지 모든 건물까지의 거리를 구했다.


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package gold;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class G21278_hoseoksTwoChickens {
	static int N, max;
	static String result;
	static List<Integer>[] nodes;
	static boolean[] visit;

	static void comb(int start, int cnt) {
		if(cnt==2) {
			bfs();
			return;
		}
		for(int i=start; i<=N; i++) {
			visit[i] = true;
			comb(i+1, cnt+1);
			visit[i] = false;
		}
	}

	static void bfs() {
		Queue<Integer> queue = new LinkedList<Integer>();
		boolean[] v = new boolean[N+1];
		String tmpResult = "";

		for(int i=1; i<=N; i++) {
			if(visit[i]) {
				v[i] = true;
				queue.add(i);
				tmpResult += i + " ";
			}
		}

		int sum=0, depth=1;
		while(!queue.isEmpty()) {
			int size = queue.size();

			for(int s=0; s<size; s++) {
				int now = queue.poll();

				for(int node : nodes[now]) {
					if(v[node]) continue;
					v[node] = true;
					queue.add(node);
					sum += depth;
					if(max!=0 && max <= sum) return; // 최소길이가 아니게 되므로 더 갈 필요가 없다
				}
			}
			depth++;
		}

		max = sum;
		result = tmpResult;
		return;
	}

	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());
		nodes = new List[N+1];
		for(int i=1; i<=N; i++) nodes[i] = new ArrayList<Integer>();

		int M = Integer.parseInt(st.nextToken());
		for(int i=0; i<M; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			nodes[a].add(b);
			nodes[b].add(a);
		}

		visit = new boolean[N+1];
		comb(1, 0);

		System.out.println(result + max*2);
	}

}
This post is licensed under CC BY 4.0 by the author.