Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 17182. ์šฐ์ฃผ ํƒ์‚ฌ์„  ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 17182. ์šฐ์ฃผ ํƒ์‚ฌ์„ 

bba_dda 2021. 8. 17. 21:51
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://www.acmicpc.net/problem/17182

 

17182๋ฒˆ: ์šฐ์ฃผ ํƒ์‚ฌ์„ 

์šฐ์ฃผ ํƒ์‚ฌ์„  anaํ˜ธ๋Š” ์–ด๋–ค ํ–‰์„ฑ๊ณ„๋ฅผ ํƒ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์‚ฌ๋œ๋‹ค. ๋ชจ๋“  ํ–‰์„ฑ์„ ํƒ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋ ค ํ•œ๋‹ค. ์ž…๋ ฅ์œผ๋กœ๋Š” anaํ˜ธ๊ฐ€ ํƒ์ƒ‰ํ•  ํ–‰์„ฑ์˜ ๊ฐœ์ˆ˜์™€ anaํ˜ธ๊ฐ€ ๋ฐœ์‚ฌ๋˜๋Š” ํ–‰์„ฑ์˜ ์œ„

www.acmicpc.net

์š”์•ฝ : 

๋ชจ๋“  ํ–‰์„ฑ์„ ํƒ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ๋ผ.

ํƒ์‚ฌ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘ ํ–‰์„ฑ์œผ๋กœ ๋Œ์•„์˜ฌ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ํ–‰์„ฑ๋„ ์ค‘๋ณตํ•ด์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

ํ’€์ด

DFS๋กœ ์ •ํ•ด์ง„ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ํ–‰์„ฑ์„ ๋ฐฉ๋ฌธํ•˜๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ์ „์— 

์ž…๋ ฅ๋œ ๊ฐ„์„ ๋“ค์„ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ๋…ธ๋“œ - ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ„์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ์˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ๊ตฌํ•ด๋†“๊ณ  ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค. 

์ตœ์†Œ ๊ฑฐ๋ฆฌ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋Š” ๋ฐ์—๋Š” ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์˜€๋‹ค.

 

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ์ด O(V^3) ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด ๋ฌธ์ œ์—์„œ V ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ 10์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋‹ด์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

์ฝ”๋“œ

#include <cstdio>
#include <algorithm>

#define sc scanf_s 
#define MAX 987654321

using namespace std;

int N, K;
int dist[10][10]; // maxN: 10
bool visited[10];

int result = MAX;
void DFS(int start, int d, int visitCount) {
	if (result < d) return;
	if (visitCount == N) {
		result = min(result, d); return;
	}
	for (int i = 0;i < N;i++) {
		if (visited[i]) continue;
		visited[i] = 1;
		DFS(i, d + dist[start][i], visitCount + 1);
		visited[i] = 0;
	}
}
int main() {
	sc("%d %d", &N, &K);
	for (int i = 0;i < N;i++) 
		for (int j = 0;j < N;j++) 
			sc("%d", &dist[i][j]);

	// ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ 
	for (int k = 0;k < N;k++) {
		for (int i = 0;i < N;i++) {
			for (int j = 0;j < N;j++) {
				dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
			}
		}
	}

	// ๋ชจ๋“  ํ–‰์„ฑ์„ ํƒ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ์ฐพ๊ธฐ 
	visited[K] = 1;
	DFS(K, 0, 1);
	printf("%d\n", result);
	return 0;
}

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•