注意输入数据的提取,m可以取到10
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int INF=1000000000;
int g[1020][1020];
int vis[1020];
int dis[1020];
int n,m,k,ds;
void Dijkstra(int x){
fill(vis,vis+1020,0);
fill(dis,dis+1020,INF);
dis[x]=0;
for(int i=1;i<=n+m;i++){
int u=-1;
int MIN=INF;
for(int j=1;j<=n+m;j++){
if(vis[j]==0&&dis[j]<MIN){
u=j;
MIN=dis[j];
}
}
//printf("u:%d\n",u);
if(u==-1)return;
vis[u]=1;
for(int v=1;v<=n+m;v++){
if(dis[u]+g[u][v]<dis[v]&&vis[v]==0&&g[u][v]!=INF){
dis[v]=dis[u]+g[u][v];
}
}
}
}
int getid(string x){
int ans=0;
for(int i=0;i<x.length();i++){
if(x[i]!='G'){
ans=ans*10+x[i]-'0';
}
}
if(x[0]=='G')return n+ans;
else return ans;
}
int main(){
fill(g[0],g[0]+1020*1020,INF);
scanf("%d%d%d%d",&n,&m,&k,&ds);//房子的数目,candidate的数目,路的数目,辐射范围
string a,b;
int c;
for(int i=0;i<k;i++){
cin>>a>>b>>c;
g[getid(a)][getid(b)]=c;
g[getid(b)][getid(a)]=c;
}
/*for(int i=1;i<n+m+1;i++){
for(int j=1;j<n+m+1;j++){
if(g[i][j]==INF){
printf("- ");
}else{
printf("%d ",g[i][j]);
}
}
printf("\n");
}*/
int pos=-1,temp;
double minmax=-1,avg,minAvg=INF;
for(int i=n+1;i<=n+m;i++){
avg=0;temp=INF;
Dijkstra(i);
/*for(int j=1;j<n+1;j++){
printf("%d\n",dis[j]);
}*/
for(int j=1;j<=n;j++){
avg=avg+dis[j];
if(dis[j]>ds){//超出辐射范围
temp=INF;
break;
}else if(dis[j]<temp){
temp=dis[j];//到某个站的最短距离
}
}
if(temp==INF)continue;
//printf("%d,%d\n",temp,i);
if(temp>minmax){
minmax=temp;
pos=i;
minAvg=avg;
}else if(temp==minmax&&avg<minAvg){
pos=i;
minAvg=avg;
}
//printf("%d,%lf\n\n",pos,avg/n);
}
if(pos==-1){
printf("No Solution\n");
}else{
printf("G%d\n",pos-n);
printf("%.1lf %.1lf\n",minmax,minAvg/n);
}
}