Algorithm 문제풀이/simulation
[BOJ] 백준 14889- 스타트와링크(JAVA)
cjsong
2019. 8. 16. 21:19
조합 2번 사용 : 1. 팀을 N/2 만큼 나누고 그 팀을 2명씩 또 조합해서 나누어줌
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main{
private static int[][] ability;
private static int N;
private static int result;
private static int[] linkTeam;
private static int[] arr;
private static int[] startTeam;
private static int[] startPair;
private static int[] linkPair;
private static int startSumValue;
private static int linkSumValue;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
ability = new int[N][N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
ability[i][j] = Integer.parseInt(st.nextToken());
}
}
result = Integer.MAX_VALUE;
startSumValue = 0;
linkSumValue = 0;
arr = new int[N];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
linkTeam = new int[N / 2];
splitTeam(0, 0);
System.out.println(result);
}// end of main
public static void splitTeam(int k, int len) {
if (len == N / 2) {
process();
}
startSumValue =0;
linkSumValue =0;
return;
}
for (int i = k; i < arr.length; i++) {
linkTeam[len] = arr[i];
splitTeam(i + 1, len + 1);
}
}
public static void process() {
boolean[] visited = new boolean[N];
for (int i = 0; i < linkTeam.length; i++) {
visited[linkTeam[i]] = true;
}
int index = 0;
startTeam = new int[N/2];
for (int i = 0; i < visited.length; i++) {
if(!visited[i]) {
startTeam[index++] = i;
}
}
startPair = new int[2];
linkPair = new int[2];
splitPair(0,0);
}
public static void splitPair(int k, int len) {
if(len == 2) {
result(startPair, linkPair);
return;
}
for (int i = k; i < startTeam.length; i++) {
startPair[len] =startTeam[i];
linkPair[len] = linkTeam[i];
splitPair(i+1, len+1);
}
}
private static void result(int[] start, int[] link) {
for (int i = 0; i < link.length-1; i++) {
startSumValue += ability[start[i]][start[i+1]] + ability[start[i+1]][start[i]];
linkSumValue += ability[link[i]][link[i+1]] + ability[link[i+1]][link[i]];
}
}
}// end of class
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |