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;
}

 

κ²°κ³Ό

λ°˜μ‘ν˜•