λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 10971번 - μ™ΈνŒμ› 순회2

by μ•ˆμ£Όν˜• 2022. 8. 20.

문제

 

10971번: μ™ΈνŒμ› 순회 2

첫째 쀄에 λ„μ‹œμ˜ 수 N이 주어진닀. (2 ≤ N ≤ 10) λ‹€μŒ N개의 μ€„μ—λŠ” λΉ„μš© 행렬이 주어진닀. 각 ν–‰λ ¬μ˜ 성뢄은 1,000,000 μ΄ν•˜μ˜ μ–‘μ˜ μ •μˆ˜μ΄λ©°, 갈 수 μ—†λŠ” κ²½μš°λŠ” 0이 주어진닀. W[i][j]λŠ” λ„μ‹œ iμ—μ„œ j

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>
#include <memory.h>

using namespace std;

int N, min_cost = 1e9;
int graph[11][11];
int visited[11];


void dfs(int start, int node, int cost, int depth){\
    if(depth == N && node == start){
        min_cost = min(min_cost, cost + graph[node][start]);
        return;
    }
    for(int i=0; i<N; i++){
        if(!visited[i] && graph[node][i] && cost<min_cost){
            visited[i] = 1;
            dfs(start, i, cost+graph[node][i], depth + 1);
            visited[i] = 0;
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N;
    
    for(int i=0; i<N; i++){
        for(int k=0; k<N; k++){
            cin>>graph[i][k];
        }
    }
    
    for(int i=0; i<N; i++){
        dfs(i, i, 0, 0);
        memset(visited, 0 ,sizeof(visited));
    }
    cout<<min_cost;
}

 

풀이

μ™ΈνŒμ› μˆœνšŒλž€ Traveling Salesman problem (TSP) 라고도 뢈리며, κ·Έλž˜ν”„μ—μ„œ 좜발 μ •μ μ—μ„œ λ‹€λ₯Έ λͺ¨λ“  정점듀을 λ°©λ¬Έν•˜κ³  μ›λž˜μ˜ 좜발 μ •μ μœΌλ‘œ λ˜λŒμ•„μ˜€λŠ” μˆœν™˜ κ²½λ‘œλ“€ μ€‘μ—μ„œ κ°€μ€‘μΉ˜μ˜ 합이 μ΅œμ†Œκ°€ λ˜λŠ” μˆœν™˜ 경둜λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

즉, κ²½λ‘œκ°€ 5개의 λ…Έλ“œκ°€ μžˆμ„ λ•Œ 1 -> 2 -> 3 -> 4 -> 5 -> 1 이런 μ‹μœΌλ‘œ λŒμ•„μ˜¬ λ•Œ κ°€μ€‘μΉ˜μ˜ 합이 κ°€μž₯ μ΅œμ†Œκ°€ λ˜λŠ” 경둜λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μœ„ λ¬Έμ œμ—μ„œλŠ” μ΅œμ†Œ λΉ„μš©μ„ 좜λ ₯ν•˜λΌκ³  ν–ˆκΈ° λ•Œλ¬Έμ— λ°±νŠΈλž™ν‚Ήμ„ λŒλ €μ„œ μ΅œμ†Œ λΉ„μš©λ§Œ 계속 κ°±μ‹ ν•΄κ°€λ©° μ΅œμ’…μ μœΌλ‘œ 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

λŒ“κΈ€