PAT Gas Station (30)
题目简介:
给出n个房屋,m个备选的加油站,k条路,和加油站到房屋的最长距离ds。要求在m个备选的加油站中确定一个加油站,要求满足:
1)所有房屋必须在服务范围内(最短距离小于等于ds),距离最近的房屋距离尽可能远;
2)在一的情况下,如果有多个地址满足条件,就选择平局距离最小的;
3)在二的情况下,如果还有多个地址满足条件,就选择下标最小的;
解决思路:
使用邻接表作为存储结构,对于m个候选地址,分别调用最短路算法,进行统计,最后按照要求输出。存在一种情况,那就是图不连通,这种情况下特殊判断一下就好了
代码:
1 #include<iostream> 2 #include<ctype.h> 3 #include<string.h> 4 #include<vector> 5 #include<map> 6 using namespace std; 7 #define N 1100 8 int ZERO; 9 int n,m,k,ds; 10 int parse(char* str) 11 { 12 int num; 13 if(isdigit(str[0])) 14 { 15 sscanf(str,"%d",&num); 16 return num-1; 17 }else 18 { 19 sscanf(str+1,"%d",&num); 20 return num+ZERO-1; 21 } 22 } 23 struct Result 24 { 25 int id; 26 int minDis;//max 27 double average;//min 28 }r,tr; 29 struct Edge 30 { 31 int id; 32 int dis; 33 Edge(int id,int dis):id(id),dis(dis){} 34 }; 35 map<int,vector<Edge>> maps; 36 int main() 37 { 38 //freopen("in.txt","r",stdin); 39 //freopen("out.txt","w",stdout); 40 scanf("%d%d%d%d",&n,&m,&k,&ds); 41 char mark1[N],mark2[N]; 42 int tempDis,a,b; 43 ZERO=n; 44 int i=0; 45 for(i=0;i<k;i++) 46 { 47 scanf("%s%s%d",mark1,mark2,&tempDis); 48 a=parse(mark1); 49 b=parse(mark2); 50 maps[a].push_back(Edge(b,tempDis)); 51 maps[b].push_back(Edge(a,tempDis)); 52 } 53 int distance[N]; 54 bool vis[N],find; 55 int len=m+n; 56 int index,j; 57 r.id=-1; 58 for(i=0;i<m;i++) 59 { 60 for(j=0;j<len;j++) 61 { 62 distance[j]=-1; 63 } 64 memset(vis,false,sizeof(bool)*len); 65 distance[ZERO+i]=0; 66 vector<Edge>::iterator ele; 67 while(true)//djkstra 68 { 69 find=false; 70 for(j=0;j<len;j++) 71 { 72 if(!vis[j]&&distance[j]!=-1&&(find==false||distance[j]<distance[index])) 73 { 74 find=true; 75 index=j; 76 } 77 } 78 if(!find) 79 break; 80 vis[index]=true; 81 for(ele=maps[index].begin();ele!=maps[index].end();ele++) 82 { 83 if(distance[ele->id]==-1||distance[ele->id]>distance[index]+ele->dis) 84 { 85 distance[ele->id]=distance[index]+ele->dis; 86 } 87 } 88 } 89 tr.average=0; 90 tr.minDis=-1; 91 tr.id=i; 92 for(j=0;j<n;j++) 93 { 94 if(distance[j]>ds||distance[j]==-1) 95 break; 96 tr.average+=distance[j]; 97 if(tr.minDis==-1||tr.minDis>distance[j]) 98 tr.minDis=distance[j]; 99 } 100 if(j<n) 101 continue; 102 if(r.id<0|| 103 r.minDis<tr.minDis|| 104 (r.minDis==tr.minDis&&r.average>tr.average)) 105 { 106 r=tr; 107 } 108 } 109 if(r.id<0) 110 { 111 printf("No Solution\n"); 112 }else 113 { 114 printf("G%d\n%.1lf %.1lf\n",r.id+1,r.minDis*1.0,r.average*1.0/n); 115 } 116 return 0; 117 }

浙公网安备 33010602011771号