• BOJ 17182 우주 탐사선 /C++

    2022. 5. 23.

    by. 내이름은 킹햄찌

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

     

    17182번: 우주 탐사선

    우주 탐사선 ana호는 어떤 행성계를 탐사하기 위해 발사된다. 모든 행성을 탐사하는데 걸리는 최소 시간을 계산하려 한다. 입력으로는 ana호가 탐색할 행성의 개수와 ana호가 발사되는 행성의 위

    www.acmicpc.net

    백준 온라인저지 17182번 우주 탐사선 문제입니다.

     

    아이디어

    모든 행성을 탐사하는데 최소시간을 구해야하는데 행성의 중복방문이 허용이 되기 때문에 행성간의 최소거리 그래프를 구하기 위해 플로이드 와샬 알고리즘을 사용했고, 행성의 방문 여부를 표현하기 위해 비트마스킹을 사용했는데 bitset 자료구조를 사용했습니다. 구해놓은 행성간의 최소거리 그래프를 참고하여 dfs를 이용한 완전탐색으로 풀이했습니다.

     

    #include<iostream>
    #include<bitset>
    #define MAX 51
    #define INF 987654321
    using namespace std;
    
    
    bitset<10> bit;
    int dist[MAX][MAX];
    int map[MAX][MAX];
    
    int n, s;
    int minIdx = INF;
    int min(int a, int b) { return a > b ? b : a; }
    
    void input() {
    	cin >> n >> s;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++)
    			cin >> map[i][j];
    	}
    }
    
    
    void dfs(int current, int currDist) {
    
    	if (bit.count() == n)
    		minIdx = min(currDist, minIdx);
    
    
    	//최솟값보다 크다면
    	if (currDist > minIdx) return;
    
    	//행성 방문
    	for (int i = 0; i < n; i++) {
    		//현재 방문한 행성이면
    		if (bit[i]) continue;
    		bit[i] = 1;
    		dfs(i, currDist + map[current][i]);
    		bit[i] = 0;
    	}
    }
    
    void solution() {
    
    	//플로이드 와샬
    	for (int i = 0; i < n; i++)
    		for (int j = 0; j < n; j++)
    			for (int k = 0; k < n; k++)
    				if (map[i][j] + map[j][k] < map[i][k])
    					map[i][k] = map[i][j] + map[j][k];
    
    
    	bit[s] = 1;
    	dfs(s,0);
    	cout << minIdx;
    }
    int main(void) {
    	input();
    	solution();
    }

    댓글