[λ°±μ€/C++] 17182. μ°μ£Ό νμ¬μ
λ¬Έμ
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;
}