题解:
PAT甲级 1072 Gas Station 单源最短路
和这道题基本上是一样的。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#define MAX 1020
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct station{
double avgdis;//平均距离
double mindis;//最小距离
int id;//编号
bool operator < (const station &a) const{
if(mindis>a.mindis) return true;
else if(mindis==a.mindis){
if(avgdis<a.avgdis) return true;
else if(avgdis==a.avgdis){
return id<a.id;
}
}
return false;
}
};
int n,m,k,d;
int visit[MAX],mp[MAX][MAX],dis[MAX];
vector<station> sta;
void dijkstra(int s){
for(int i=0;i<MAX;i++){
visit[i]=0;
dis[i]=INF;
}
dis[s]=0;
for(int i=1;i<=n+m;i++){
int u=-1,minl=INF;
for(int j=1;j<=n+m;j++){
if(visit[j]==0&&dis[j]<minl){
u=j;
minl=dis[j];
}
}
if(u==-1) break;
visit[u]=1;
for(int v=1;v<=n+m;v++){
if(visit[v]==0&&mp[u][v]!=INF){
if(dis[u]+mp[u][v]<dis[v]){
dis[v]=dis[u]+mp[u][v];
}
}
}
}
}
int to_index(string s){
int num=0;
bool flag=false;
for(int i=0;i<s.length();i++){
if(s[i]=='G') {flag=true;continue;}
num=num*10+s[i]-'0';
}
if(flag) num+=n;
return num;
}
int main(){
memset(mp,INF,sizeof(mp));
cin>>n>>m>>k>>d;
int len,aa,bb;
string a,b;
for(int i=0;i<k;i++){
cin>>a>>b>>len;
aa=to_index(a);
bb=to_index(b);
mp[aa][bb]=mp[bb][aa]=len;
}
for(int i=n+1;i<=n+m;i++){
dijkstra(i);
int minl=INF;
double totdis=0.0;
bool flag=true;
for(int j=1;j<=n;j++){
if(dis[j]>d) {flag=false;break;}
totdis+=dis[j];
minl=min(minl,dis[j]);
}
if(flag){
station tmp;
tmp.mindis=minl;
tmp.avgdis=totdis/n;
tmp.id=i;
sta.push_back(tmp);
}
}
sort(sta.begin(),sta.end());
if(sta.size()==0) printf("No Solution");
else printf("G%d\n%.1f %.1f",sta[0].id-n,sta[0].mindis,sta[0].avgdis);
return 0;
}