ACM
2009. 6. 2. 20:51
반응형
I got time limite from Judge Server. T.T
#include <stdio.h> #define MAX_CITY 101 #define DISCONNECTED 0 #define PASSED 1 #define NOTPASSED 0 typedef struct TourInfo{ int roadNum; // road Number (input) int cityNum; // city Number (input) int roadInfo[MAX_CITY][MAX_CITY]; // road info (max passenger info) int cityIsPassed[MAX_CITY]; // passed or not passed int cityMinNum[MAX_CITY]; // min Passenger Number int startCity; // start (input) int destCity; // destination (input) int totalPassengerNum; // total passenger Number (input) int minPassengerNum; // result }TourInfo; void initTourInfo(); int findMinNumberOfTrips(int left); TourInfo tour; int main(void) { int firstCity, secondCity, maxPassengerNum; int scenarioCount=0, result, i; while(1){ scanf("%d %d", &tour.cityNum, &tour.roadNum); if(tour.cityNum==0 && tour.roadNum==0) break; result = 0; initTourInfo(); for(i=0; i<tour.roadNum; i++){ scanf("%d %d %d", &firstCity, &secondCity, &maxPassengerNum); tour.roadInfo[firstCity][secondCity] = maxPassengerNum; tour.roadInfo[secondCity][firstCity] = maxPassengerNum; } scanf("%d %d %d", &tour.startCity, &tour.destCity, &tour.totalPassengerNum); if(tour.totalPassengerNum < 1) break; findMinNumberOfTrips(tour.startCity); scenarioCount++; result = tour.totalPassengerNum / (tour.minPassengerNum-1); if(tour.totalPassengerNum % (tour.minPassengerNum-1)) result++; printf("Scenario #%d\n", scenarioCount); printf("Minimum Number of Trips = %d\n\n", result); } return 0; } int findMinNumberOfTrips(int left) { int i, right, minPass; tour.cityIsPassed[left]=PASSED; // Last City if(left==tour.destCity){ if(!tour.minPassengerNum) { tour.minPassengerNum = tour.cityMinNum[left]; } else { if(tour.minPassengerNum < tour.cityMinNum[left]) { tour.minPassengerNum = tour.cityMinNum[left]; } } tour.cityMinNum[left]=NOTPASSED; tour.cityIsPassed[left]=NOTPASSED; return 1; } for(right=1; right<=tour.cityNum; right++) { if(tour.cityIsPassed[right]==PASSED) continue; // already passed city if(tour.roadInfo[left][right]!=0) // CONNECTED { if(!tour.cityMinNum[left]){ // first path tour.cityMinNum[right] = tour.roadInfo[left][right]; } else{ if(tour.cityMinNum[left] > tour.roadInfo[left][right]){ tour.cityMinNum[right] = tour.roadInfo[left][right]; } else{ tour.cityMinNum[right] = tour.cityMinNum[left]; } } if(tour.minPassengerNum >= tour.cityMinNum[right]) continue; findMinNumberOfTrips(right); } } // init and return tour.cityMinNum[left]=NOTPASSED; tour.cityIsPassed[left]=NOTPASSED; return 1; } void initTourInfo() { int i,j; for(i=0; i<MAX_CITY; i++) { for(j=0; j<MAX_CITY; j++) { tour.roadInfo[i][j] = DISCONNECTED; } tour.cityIsPassed[i] = NOTPASSED; tour.cityMinNum[i] = NOTPASSED; } tour.minPassengerNum = 0; }
반응형
'ACM' 카테고리의 다른 글
[Accept] 10099 - The Tourist Guide (0) | 2009.06.02 |
---|---|
[Accept] 10099 - The Tourist Guide (0) | 2009.06.02 |
[Accept] 10004 - Bicoloring problem (0) | 2009.06.02 |
[Accept] 100 - The 3n+1 problem (0) | 2009.06.02 |
10006 - Carmichael Numbers (0) | 2009.06.02 |