๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 10971 : ์™ธํŒ์› ์ˆœํšŒ 2 (์™„์ „ํƒ์ƒ‰, dfs, Backtracking)

by xxilliant 2023. 3. 6.
728x90
๋ฐ˜์‘ํ˜•

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

๋ฌธ์ œ

์™ธํŒ์› ์ˆœํšŒ ๋ฌธ์ œ๋Š” ์˜์–ด๋กœ Traveling Salesman problem (TSP) ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฌธ์ œ๋กœ computer science ๋ถ„์•ผ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณ€์ข… ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋‚˜, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์˜ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š” ๋„์‹œ๋“ค์ด ์žˆ๊ณ , ๋„์‹œ๋“ค ์‚ฌ์ด์—๋Š” ๊ธธ์ด ์žˆ๋‹ค. (๊ธธ์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค) ์ด์ œ ํ•œ ์™ธํŒ์›์ด ์–ด๋А ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๊ฑฐ์ณ ๋‹ค์‹œ ์›๋ž˜์˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ณ„ํšํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋‹จ, ํ•œ ๋ฒˆ ๊ฐ”๋˜ ๋„์‹œ๋กœ๋Š” ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค. (๋งจ ๋งˆ์ง€๋ง‰์— ์—ฌํ–‰์„ ์ถœ๋ฐœํ–ˆ๋˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์€ ์˜ˆ์™ธ) ์ด๋Ÿฐ ์—ฌํ–‰ ๊ฒฝ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ์—ฌํ–‰ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ ์ž ํ•œ๋‹ค.

๊ฐ ๋„์‹œ๊ฐ„์— ์ด๋™ํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์€ ํ–‰๋ ฌ W[i][j]ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋น„์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋น„์šฉ์€ ๋Œ€์นญ์ ์ด์ง€ ์•Š๋‹ค. ์ฆ‰, W[i][j] ๋Š” W[j][i]์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๋„์‹œ๊ฐ„์˜ ๋น„์šฉ์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค. W[i][i]๋Š” ํ•ญ์ƒ 0์ด๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฉฐ ์ด๋Ÿด ๊ฒฝ์šฐ W[i][j]=0์ด๋ผ๊ณ  ํ•˜์ž.

N๊ณผ ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ์™ธํŒ์›์˜ ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 10) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰๋ ฌ์˜ ์„ฑ๋ถ„์€ 1,000,000 ์ดํ•˜์˜ ์–‘์˜ ์ •์ˆ˜์ด๋ฉฐ, ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ j๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋น„์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ•ญ์ƒ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์™ธํŒ์›์˜ ์ˆœํšŒ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๋ฐฑ์ค€ ์‹ค๋ฒ„2.

Traveling Salesman Problem, ์ค„์—ฌ์„œ TSP

์ด๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—…์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ ๊ฒƒ ๊ฐ™์Œ

 

TSP๋Š” NP-Hard ๋ฌธ์ œ์˜ ์ผ์ข…์ด๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๊ทธ๋ƒฅ ํ’€๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋ผ๋Š” ๋œป์ด๋‹ค

 

 

main ideas

 

1. ์ผ๋‹จ ๋ฌด์ง€์„ฑ dfs...ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์œ„ํ•ด dfs ๋‹ค์Œ์— ์ƒํƒœ๋ฅผ ๊ธฐ์กด์œผ๋กœ ๋Œ๋ ค๋†“๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์‹œ์ž‘์ ์„ ๊ณ ๋ คํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํƒ์ƒ‰ -> ์žฌ๊ท€ ์ง„์ž…ํ• ๋•Œ๋„ ๋ฐ˜๋ณต๋ฌธ ํ•„์š”ํ•จ

 

2. ๋ฐฉ๋ฌธํ•˜๋ ค๋Š” ๋‹ค์Œ ๋งˆ์„์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ๊ฑฐ๋‚˜, ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด continue

 

3. ๋งˆ์ง€๋ง‰ ๋งˆ์„์—์„œ ์ถœ๋ฐœ์ง€๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋กœ ์ธ์ •๋จ. (์ˆœํšŒ ๊ฐ€๋Šฅ)

 

4. ์ตœ์†Œ๊ฐ’์€ ์„ ์–ธ ์‹œ INT_MAX๋กœ ํ•ด๋†“๊ณ , ์ˆœํšŒํ•˜๋ฉด์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ

 

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

int n;
int w[10][10] = {0};
int visited[10] = {0};
int answer = INT_MAX;

void travel(int start, int now, int cnt, int sum){
    if(cnt == n){
        if(w[now][start] == 0) return; // ๋งˆ์ง€๋ง‰ ๋งˆ์„์—์„œ ์ถœ๋ฐœ์ง€๋กœ ๋ชป ๋Œ์•„๊ฐˆ๋•Œ
        if(answer > sum + w[now][start]) answer=sum+w[now][start]; // ์ตœ์†Ÿ๊ฐ’ ๋Œ€์ฒด
        return;
    }

    for (int i = 0; i < n; ++i){
        if(visited[i]==1 || w[now][i]==0) continue; // ๋งˆ์„๋ฐฉ๋ฌธ or ๊ธธ์—†์„๋•Œ
        visited[i] = 1;
        travel(start, i, cnt + 1, sum + w[now][i]);
        visited[i] = 0; // ํƒ์ƒ‰ ์ข…๋ฃŒ ํ›„ ๋‹ค๋ฅธ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰์„ ์œ„ํ•ด ๋˜๋Œ๋ ค๋†“๊ธฐ
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            cin >> w[i][j];
        }
    }

    for (int i = 0; i < n; ++i){
        visited[i] = 1;
        travel(i, i, 1, 0);
        visited[i] = 0; // ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•ด ๋˜๋Œ๋ ค๋†“๊ธฐ
    }
    cout << answer;
}

 

728x90
๋ฐ˜์‘ํ˜•