코딩성장스토리

백준 10971번: 외판원 순회 2 본문

백준 코딩

백준 10971번: 외판원 순회 2

까르르꿍꿍 2022. 1. 10. 16:55

 

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

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

이 문제는 일단 주어진 수의 범위가 10까지이고 모든 순서를 따지면 10팩토리얼 이다. 즉 브루트 포스(완전 탐색)이 가능하다

0이 나오면 갈 수 없는 것이므로 이 조건만 주의하며 모든 순열 돌며 최솟값을 구하면 된다.

코드를 보자

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<vector<int>> d(n);
    vector<int> ord(n);
    for(int i=0;i<n;i++){
        ord[i]=i;                 //순서 저장하는 배열
    }
    for(int i=0;i<n;i++){
        for(int k=0;k<n;k++){
            int a;
            cin>> a;
            d[i].push_back(a);
        }
    }
    int ans=2147483647;
    do{
        bool ok=true;
        int sum=0;
        for(int i=0;i<n-1;i++){
            if(d[ord[i]][ord[i+1]]==0){         // 값이 0이면 못가는 것이므로 false
                ok=false;
            }
            else{sum+=d[ord[i]][ord[i+1]];}
        }
        if(ok&&d[ord[n-1]][ord[0]]!=0){        //갈 수없는 배열은 더하지 말기
            sum+=d[ord[n-1]][ord[0]];
            if(ans>sum){
                ans=sum;
            }
        }
    }while(next_permutation(ord.begin(),ord.end())); //배열 순서 다 확인하기
    cout << ans;

}

'백준 코딩' 카테고리의 다른 글

백준 1722번:순열의 순서  (0) 2022.01.15
백준:6603번 로또  (0) 2022.01.11
백준 1463번: 1로 만들기  (0) 2022.01.09
백준 10819번: 차이를 최대로  (0) 2022.01.06
백준 1074번:Z  (0) 2022.01.05