문제 요약 : 출발 지점과 도착지점이 정해진 상태.
버스기사가 승객을 데리고 출발점에서 도착점까지 이동해야 합니다.
하지만 승객 수가 많고, 각 도시간의 길에는 제한 인원이 있기 때문에 1번 이상의 trip이 필요합니다.
최소한의 trip수로 모든 승객을 다 도착지로 보내는 문제입니다.
해결 방법 : 다익스트라 알고리즘을 활용했습니다.
결과 : Accepted
#include<iostream> using namespace std; int N, R; int c1, c2, p; int start, dest, numOfTourists; int line[101][101]; int value[101]; bool check[101]; int cur; void init() { for(int i = 1; i <= 100; i++) { check[i] = false; value[i] = 0; for(int j = 1; j <= 100; j++) { line[i][j] = -1; } } } int calc() { check[start] = true; value[start] = 0; cur = start; while(true) { for(int i = 1; i <= 100; i++) { if(line[cur][i] != -1) { if(check[i]) continue; int temp; if(value[cur] > line[cur][i]) { temp = line[cur][i]; } else { temp = value[cur]; } if(value[i] == 0) { //i번째 vertex의 값이 비어 있다. value[i] = line[cur][i]; } else if(value[i] < temp) { //i번째 vertext 값보다 현재 vertex 값에서 i번 vetex로 향하는 엣지의 합이 더 큰 경우 value[i] = temp; } else if(value[i] > temp) { line[i][cur] = line[cur][i] = -1; } } } int max = -1; int index = 0; for(int i = 1; i <= 100; i++) { if(check[i] || value[i] == 0) continue; if(max < value[i]) { max = value[i]; index = i; } } check[index] = true; cur = index; if(cur == dest) return value[dest]; } } int calc2(int maxNum) { int num = 1; int addingNum = maxNum - 1; int sum = 0; while(true) { sum += addingNum; if(sum >= numOfTourists) return num; num++; } } int main() { //freopen("input.txt", "r", stdin); int index = 1; while(true) { cin >> N >> R; if(N == 0 && R == 0) break; init(); for(int i = 0; i < R; i++) { cin >> c1 >> c2 >> p; line[c1][c2] = p; line[c2][c1] = p; } cin >> start >> dest >> numOfTourists; //end of input int result = calc(); cout << "Scenario #" << index << endl; cout << "Minimum Number of Trips = " << calc2(result) << endl << endl; index++; } return 0; }
'알고리즘' 카테고리의 다른 글
Prime Gap (0) | 2010.08.28 |
---|---|
Palindrome Numbers (2) | 2010.08.05 |
Word Index (0) | 2010.07.31 |
Knights Move (0) | 2010.07.29 |