这道题是求M个候选点到N个house的最短路,从M个点中选符合条件的一个点。题目不难,由于没处理好几个细节,导致了很多bug。一开始wa以为是卡在int没有用longlong,但改完发现的其他bug后就A了,看来pat不会故意在数据大小上卡。
bug如下:
1、节点标号使用字符串读,转换为整数时只转换了一位,没有考虑到多位的情况。
2、求距离之和时sum的初始化放在了for循环的外面,应该放在for循环的第一句,否则只有第一个求的正确,后面的会累加。
3、求最小值该用>的地方写成<。
4、这个是最隐蔽的bug,题目说要保证候选点到house的距离in its service range,这里应该用<=,写成<,导致第一个case都没过。将题意转换成代码时没有转换正确。真是细节决定成败啊。
附代码:
1 //pat1072 Gas Station 2 #include<stdio.h> 3 #include <stdlib.h> 4 #include <string> 5 #include <iostream> 6 using namespace std; 7 //总节点数 8 #define MAXN 1100 9 #define inf 2000000000 10 struct Candidate 11 { 12 int min,max; 13 double average; 14 }candidate[15]; 15 int map[MAXN][MAXN],Min[MAXN]; 16 //所有节点数=N+M,包含候选点,0到M-1为候选点,M到n-1为house 17 int n; 18 19 void dijkstra(int s,int* min) 20 { 21 int v[MAXN],i,j,k; 22 for (i=0;i<n;i++) 23 {min[i]=inf,v[i]=0;} 24 for (min[s]=0,j=0;j<n;j++) 25 { 26 //找距离最小的点,最初为源点 27 for (k=-1,i=0;i<n;i++) 28 { 29 if (!v[i]&&(k==-1||min[i]<min[k])) 30 k=i; 31 } 32 //比较从经过该点到其他点的距离与当前最小距离,更新当前最小距离 33 for (v[k]=1,i=0;i<n;i++) 34 { 35 if (!v[i]&&min[k]+map[k][i]<min[i]) 36 min[i]=min[k]+map[k][i]; 37 } 38 } 39 } 40 int char2int(char* p,int M) 41 { 42 int ans=0,j; 43 if(p[0]=='G') 44 { 45 j=1; 46 while(p[j]!='