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 }

 

posted @ 2016-11-16 22:41  冠king  阅读(85)  评论(0)    收藏  举报