Notice
Recent Posts
Recent Comments
Link
Dev.baelanche
[백준 14889] 스타트와 링크 본문
반응형
백트래킹으로 가능한 모든 팀을 구성한 뒤 최솟값을 구했다.
위의 예제로 설명하겠다.
1. 인덱스별로 DFS를 한다.
2. n/2 일때 방문한 노드2개 방문안한 노드2개 이므로 방문한 쪽/ 안한 쪽으로 팀을 나눈다.
3. 배열이나 리스트에 각 노드를 담아서 능력치 차이를 계산한다.
백트래킹을 제외하면 자기 스타일대로 구현을 하면 된다.
public class Main {
static int n;
static int a[][];
static boolean visited[];
static int min = Integer.MAX_VALUE;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
a = new int[n][n];
visited = new boolean[n];
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<n; j++)
a[i][j] = Integer.parseInt(st.nextToken());
}
dfs(0, 0);
System.out.println(min);
}
public static void dfs(int idx, int len) {
if(len == n/2) {
int startTeam[] = new int[n/2 + 1];
int linkTeam[] = new int[n/2 + 1];
int s = 0;
int l = 0;
for(int i=0; i<n; i++) {
if(visited[i])
startTeam[s++] = i;
else
linkTeam[l++] = i;
}
int start = 0;
int link = 0;
for(int i=0; i<n/2; i++) {
for(int j=i+1; j<n/2; j++) {
start += a[startTeam[i]][startTeam[j]] + a[startTeam[j]][startTeam[i]];
link += a[linkTeam[i]][linkTeam[j]] + a[linkTeam[j]][linkTeam[i]];
}
}
min = Math.min(min, Math.abs(start - link));
return;
}
for(int i=idx; i<n; i++) {
if(!visited[i]) {
visited[i] = true;
dfs(i, len+1);
visited[i] = false;
}
}
}
}
반응형
'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글
[백준 17144] 미세먼지 안녕! (0) | 2019.06.20 |
---|---|
[백준 16234] 인구 이동 (0) | 2019.06.20 |
[백준 문제집] N과 M 시리즈 (0) | 2019.06.19 |
[백준 10997] 별 찍기 - 22 (0) | 2019.06.19 |
[백준 10993] 별 찍기 - 18 (0) | 2019.06.18 |
Comments