每天进步一点点
其实今天做出这个的时候还是小小的得意了一下的,感觉其实真的挺不错的~
poj2263-这个就是用的dijkstra
还是不大会用这个博客的。。慢慢进步吧~
#define LOCAL #include <stdio.h> #include <string.h> #include <math.h> #define MAXN 200 + 10 #define MAXL 30 + 10 char cities[MAXN][MAXL]; int graph[MAXN][MAXN]; int FindCities(char *city, int j); int Dijkstra(int start, int destination, int numberOfCities); int main() { #ifdef LOCAL freopen("C:\\Users\\Administrator\\Desktop\\ACMTempIn.txt", "r", stdin); freopen("C:\\Users\\Administrator\\Desktop\\ACMTempOut.txt", "w", stdout); #endif int numberOfRoads; int numberOfCities; char start[MAXL], destination[MAXL]; int i,j,k; char city[MAXL]; int cityIndex1; int cityIndex2; int result, count = 0; while(scanf("%d%d", &numberOfCities, &numberOfRoads) && numberOfRoads + numberOfCities != 0) { j = 0; count++; memset(graph, -1, sizeof(graph)); for(i = 0; i < numberOfRoads; i++) { memset(city, -1, sizeof(city)); scanf("%s", &city); if(FindCities(city, j) == -1) { strcpy(cities[j], city); j++; } cityIndex1 = FindCities(city, j); memset(city, -1, sizeof(city)); scanf("%s", &city); if(FindCities(city, j) == -1) { strcpy(cities[j], city); j++; } cityIndex2 = FindCities(city, j); scanf("%d", &k); graph[cityIndex1][cityIndex2] = k; graph[cityIndex2][cityIndex1] = k; } scanf("%s%s", &start, &destination); cityIndex1 = FindCities(start, j); cityIndex2 = FindCities(destination, j); result = Dijkstra(cityIndex1, cityIndex2, numberOfCities); printf("Scenario #%d\n%d tons\n\n", count, result); } return 0; } int Dijkstra(int start, int destination, int numberOfCities) { int bluePoint[MAXN]; int redPoint[MAXN]; int d[MAXN]; int i,j; memset(bluePoint, 0, sizeof(bluePoint)); memset(redPoint, 0, sizeof(redPoint)); memset(d, 0, sizeof(d)); //初始化红点集和蓝点集 redPoint[start] = 1; bluePoint[start] = 0; for(i = 0; i < numberOfCities; i++) { if(i != start) bluePoint[i] = 1; } //初始化d数组 for(i = 0; i < numberOfCities; i++) d[i] = graph[start][i]; //遍历蓝点集 for(i = 1; i < numberOfCities; i++) { //找到载重最大的城市 int max; int min; for(max = 0; !bluePoint[max];)max++; for(j = max; j < numberOfCities; j++) if(d[max] < d[j] && d[j] != -1) max = j; bluePoint[max] = 0; redPoint[max] = 1; for(j = 0; j < numberOfCities; j++) { if(d[max] > graph[max][j] && graph[max][j] != -1) min = graph[max][j]; else min = d[max]; if(min > d[j] && bluePoint[j] && graph[max][j] != -1) d[j] = min; } } return d[destination]; } int FindCities(char *city, int j) { int flag = 0; for(int i = 0; i < j + 1; i++) { if(!strcmp(city, cities[i])) { flag = i; return flag; } } return -1; }