Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

1R/2016 09 18: Difference between revisions

From ZeroWiki
No edit summary
(Repair pages found by live-compare batch 0001)
 
(2 intermediate revisions by one other user not shown)
Line 9: Line 9:
= 코드 =
= 코드 =
== 15이원준 ==
== 15이원준 ==
 
#include<iostream>
#include<algorithm>
using namespace std;
int arr[12][12] = { 0, };
int dp[12][1 << 12] = { 0, };
int N;
int TSP(int start, unsigned int mid, int dep) {
if (dp[start][mid]) {
return dp[start][mid];
}
if (dep == 1) {
    dp[start][mid] = arr[start][0];
return arr[start][0];
}
int ret;
dp[start][mid] = 11000000;
for (int i = 0; i<N; i++) {
if ((1 << i) & mid) {
int tmp = TSP(i, mid - (1 << i), dep - 1);
if (tmp != 0 &&arr[start][i]) {
dp[start][mid] = min(dp[start][mid], arr[start][i] + tmp);
}
//printf("%d %d %d %u %d %d\n",dep, start, i, mid, arr[start][i] +tmp, dp[start][mid]);
}
}
if (dp[start][mid] == 11000000) {
dp[start][mid] = 0;
return 0;
}
return dp[start][mid];
}
int main() {
cin >> N;
unsigned int mid = 0;
for (int i = 0; i<N; i++) {
mid = (mid << 1) + 1;
for (int j = 0; j<N; j++) {
cin >> arr[i][j];
}
}
cout << TSP(0, mid - 1, N) << endl;
}
== 박인서 ==
== 박인서 ==
  #include <iostream>
  #include <iostream>
  int w[11][11];
  int w[11][11];
  bool visit[11] = { false, };
  bool visit[11] = { false, };
  int min = 100000000;
  int min = 100000000;
   
   
  void back(int s, int v, int n, int c,int cnt) {
  void back(int s, int v, int n, int c,int cnt) {
  if (cnt == n && min > c + w[v][s] && w[v][s] != 0) {
  if (cnt == n && min > c + w[v][s] && w[v][s] != 0) {
  min = c + w[v][s];
  min = c + w[v][s];
  return;
  return;
  }
  }
   
   
  visit[v] = true;
  visit[v] = true;
  for (int i = 0; i < n; i++) {
  for (int i = 0; i < n; i++) {
  if (!visit[i] && min > c + w[v][i] && w[v][i] != 0)
  if (!visit[i] && min > c + w[v][i] && w[v][i] != 0)
  back(s, i, n, c + w[v][i], cnt + 1);
  back(s, i, n, c + w[v][i], cnt + 1);
  }
  }
  visit[v] = false;
  visit[v] = false;
  }
  }
   
   
Line 35: Line 80:
  for (int i = 0; i < n; i++) {
  for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++)
  for (int j = 0; j < n; j++)
  std::cin >> w[i][j];
  std::cin >> w[i][j];
  }
  }
  back(0, 0, n, 0, 1);
  back(0, 0, n, 0, 1);
Line 46: Line 91:
= 아이디어 =
= 아이디어 =
== 15이원준 ==
== 15이원준 ==
 
* '다이나믹은 어려워'로 풀었습니다.
* dfs로 탐색하고 중복되는 과정은 dp에 저장하여 풀었습니다.
== 박인서 ==
== 박인서 ==
* 백트래킹을 이용(시작점을 무조건 0번이라고 봐도 되는 이유는 순회이므로..)
* 백트래킹을 이용(시작점을 무조건 0번이라고 봐도 되는 이유는 순회이므로..)
Line 58: Line 104:


== 곽정흠 ==
== 곽정흠 ==

Latest revision as of 14:46, 26 March 2026

오늘의 문제

참가자

  • 박인서

코드

15이원준

#include<iostream>
#include<algorithm>

using namespace std;

int arr[12][12] = { 0, };
int dp[12][1 << 12] = { 0, };
int N;

int TSP(int start, unsigned int mid, int dep) {
	if (dp[start][mid]) {
		return dp[start][mid];
	}
	if (dep == 1) {
    dp[start][mid] = arr[start][0];
		return arr[start][0];
	}
	int ret;
	dp[start][mid] = 11000000;
	for (int i = 0; i<N; i++) {
		if ((1 << i) & mid) {
			int tmp = TSP(i, mid - (1 << i), dep - 1);
			if (tmp != 0 &&arr[start][i]) {
				dp[start][mid] = min(dp[start][mid], arr[start][i] + tmp);
			}
			//printf("%d %d %d %u %d %d\n",dep, start, i, mid, arr[start][i] +tmp, dp[start][mid]);
		}
	}
	if (dp[start][mid] == 11000000) {
		dp[start][mid] = 0;
		return 0;
	}
	return dp[start][mid];
}

int main() {
	cin >> N;
	unsigned int mid = 0;
	for (int i = 0; i<N; i++) {
		mid = (mid << 1) + 1;
		for (int j = 0; j<N; j++) {
			cin >> arr[i][j];
		}
	}
	cout << TSP(0, mid - 1, N) << endl;
}

박인서

#include <iostream>
int w[11][11];
bool visit[11] = { false, };
int min = 100000000;

void back(int s, int v, int n, int c,int cnt) {
	if (cnt == n && min > c + w[v][s] && w[v][s] != 0) {
		min = c + w[v][s];
		return;
	}

	visit[v] = true;
	for (int i = 0; i < n; i++) {
		if (!visit[i] && min > c + w[v][i] && w[v][i] != 0)
			back(s, i, n, c + w[v][i], cnt + 1);
	}
	visit[v] = false;
}

int main() {
	int n;
	std::cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			std::cin >> w[i][j];
	}
	back(0, 0, n, 0, 1);
	std::cout << min;
	return 0;
}

곽정흠

아이디어

15이원준

  • '다이나믹은 어려워'로 풀었습니다.
  • dfs로 탐색하고 중복되는 과정은 dp에 저장하여 풀었습니다.

박인서

  • 백트래킹을 이용(시작점을 무조건 0번이라고 봐도 되는 이유는 순회이므로..)
  • back(int s, int v, int n, int c,int cnt)
    • s : 백트래킹 시작점
    • v : 현재 위치
    • n : 도시 갯수
    • c : 현재까지의 비용
    • cnt : 현재까지 방문한 도시 갯수
  • cnt가 n일 때 c의 값을 비교하여 최솟값을 구하면 됩니다.

곽정흠