#include <bits/stdc++.h>usingnamespace std;constint N =1020, M =15, K =10010, inf =0x3f3f3f3f;int n, m, road, range, total;int d[N][N];inttransefer(char a[]){if(*a !='G')returnatoi(a);elsereturnatoi(a+1)+ n;}boolcheck(int gas,int& tmin,int& tsum){for(int i =1; i <= n; i++){if(d[gas][i]> range)returnfalse;
tsum += d[gas][i];if(d[gas][i]< tmin) tmin = d[gas][i];}returntrue;}intmain(){memset(d,0x3f,sizeof d);
cin >> n >> m >> road >> range;
total = n + m;for(int i =1; i <= total; i++){
d[i][i]=0;}char p1[6], p2[6];int dist, c1, c2;for(int i =0; i < road; i ++){scanf("%s%s%d", p1, p2,&dist);
c1 =transefer(p1);
c2 =transefer(p2);
d[c1][c2]= d[c2][c1]= dist;}for(int k =1; k <= total; k ++){for(int i =1; i <= total; i ++){for(int j =1; j <= total; j ++){
d[i][j]=min(d[i][j], d[i][k]+ d[k][j]);}}}int id =-1, Min =0, Sum = inf;for(int i = n+1; i <= total; i ++){int tsum =0, tmin = inf;if(check(i, tmin, tsum)){if(tmin > Min){
id = i;
Sum = tsum;
Min = tmin;}elseif(tmin == Min && tsum < Sum){
id = i;
Sum = tsum;}}}if(id ==-1)printf("No Solution");else{printf("G%d\n", id-n);float avg = Sum*1.0/n;printf("%.1f %.1f", Min*1.0, avg);}return0;}
dijkstra
#include <bits/stdc++.h>usingnamespace std;constint N =1020, M =15, K =10010, inf =0x3f3f3f3f;int n, m, road, range, total;int g[N][N], d[N];bool st[N];inttransefer(char a[]){if(*a !='G')returnatoi(a);elsereturnatoi(a+1)+ n;}boolcheck(int gas,int& tmin,int& tsum){for(int i =1; i <= n; i++){if(d[i]> range)returnfalse;
tsum += d[i];if(d[i]< tmin) tmin = d[i];}returntrue;}voiddijkstra(int u){memset(d,0x3f,sizeof d);memset(st,false,sizeof st);
d[u]=0;while(true){int v =-1;for(int i =1; i <= total; i ++){if(!st[i]&&(v ==-1|| d[v]> d[i]))
v = i;}if(v ==-1)break;
st[v]=true;for(int i =1; i <= total; i ++)
d[i]=min(d[i], d[v]+ g[v][i]);}return;}intmain(){memset(g,0x3f,sizeof g);
cin >> n >> m >> road >> range;
total = n + m;char p1[6], p2[6];int dist, c1, c2;for(int i =0; i < road; i ++){scanf("%s%s%d", p1, p2,&dist);
c1 =transefer(p1);
c2 =transefer(p2);
g[c1][c2]= g[c2][c1]= dist;}int id =-1, Min =0, Sum = inf;for(int i = n+1; i <= total; i ++){dijkstra(i);int tmin = inf, tsum =0;if(check(i, tmin, tsum)){if(tmin > Min){
id = i;
Sum = tsum;
Min = tmin;}elseif(tmin == Min && tsum < Sum){
id = i;
Sum = tsum;}}}if(id ==-1)printf("No Solution");else{printf("G%d\n", id-n);double avg = Sum *1.0/ n ;printf("%.1f %.1f", Min*1.0, avg);}return0;}