생각한 풀이 방식은 2차원 배열 혹은 2차원리스트에 간선정보(비용 정보)를 저장한다음, 모든 정점을 시작정점으로 해서 DFS를 돈 후 전체 정점갯수만큼 돌았을때의 최솟값을 구하는 방식이다.
for (int i = 0; i < n; i++) {
edges[i] = new ArrayList<Integer>();
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
int x = Integer.parseInt(st.nextToken());
if (x != 0) {
edges[i].add(j);
dist[i][j] = x;
}
}
}
for (int i = 0; i < n; i++) {
visited = new boolean[n];
cnt = 0;
sum = 0;
visited[i]=true;
dfs(i, i, cnt, sum);
}
(int start, int v, int cnt, int sum) = (시작 정점, 현재 정점,현재까지 거쳐온 정점 갯수, 현재까지의 비용 합)
을 넘겨준다.sum+=dist[v][next];
를 실행하고나서 sum
을 넘겨주면 안되고, 저장하지 않아야 하므로 sum+dist[v][next]
자체를 다음 dfs로 넘겨줘야 한다.public static void dfs(int start, int v, int cnt, int sum) {
if (cnt == n-1) { //n개 연결되었으면 마지막정점과 첫 정점 연결되었는지 확인하고 answer 갱신하기
if (dist[v][start] != 0)
answer = Math.min(answer, sum+dist[v][start]);
return;
}
int cur = v;
for (int i = 0; i < edges[v].size(); i++) {
int next = edges[v].get(i);
if (visited[next] == false) {
visited[v] = true;
dfs(start,next, cnt + 1, sum + dist[v][next]);
visited[next] = false;
}
}
}
package Sep_week03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class boj_10971 {
static int n;
static int cnt, sum, last;
static int answer = Integer.MAX_VALUE;
static boolean[] visited;
static ArrayList<Integer> edges[]; //간선 리스트
static int[][] dist;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
edges = new ArrayList[n];
dist = new int[n][n];
for (int i = 0; i < n; i++) {
edges[i] = new ArrayList<Integer>();
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
int x = Integer.parseInt(st.nextToken());
if (x != 0) {
edges[i].add(j);
dist[i][j] = x;
}
}
}
for (int i = 0; i < n; i++) {
visited = new boolean[n];
cnt = 0;
sum = 0;
visited[i]=true;
dfs(i, i, cnt, sum);
}
System.out.println(answer);
}
public static void dfs(int start, int v, int cnt, int sum) {
if (cnt == n-1) {
if (dist[v][start] != 0)
answer = Math.min(answer, sum+dist[v][start]);
return;
}
int cur = v;
for (int i = 0; i < edges[v].size(); i++) {
int next = edges[v].get(i);
if (visited[next] == false) {
visited[v] = true;
dfs(start,next, cnt + 1, sum + dist[v][next]);
visited[next] = false;
}
}
}
}