7-1 垃圾箱分布 (30 分)
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int inf =0x3f3f3f3f;
map<string,int>mp;
map<int,string>name;
int f,nn;
int dist[12600],vis[12600];
int dist2[11600],dist3[12600],n;
int tu[16100][16100];
int cnt =0;
int Kill[600];
int id(string h){
if(h[0]=='G'){
string j =h.substr(1);
int num = atoi(j.c_str());
return num+n;
}
else{
string j =h;
int num = atoi(j.c_str());
return num;
}
}
int pre[600],Num[600];
void dijkstra(int s){
memset(dist,inf,sizeof dist);
// memset(dist2,0,sizeof dist2);
// memset(dist3,0,sizeof dist3);
// memset(Num,0,sizeof Num);
memset(vis,0,sizeof vis);
// memset(pre,-1,sizeof pre);
dist[s] =0;
// dist3[s] =Kill[s];
while(1){
int x =-1,Min =inf;
for(int i=1;i<=nn+n;i++)
{
if(!vis[i]&&Min>dist[i]){
Min = dist[i];
x =i;
}
}
if(x==-1)break;
vis[x] = 1;
for(int i=1;i<=nn+n;i++){
if(!vis[i]){
if(dist[i]>=dist[x]+tu[x][i]){
dist[i] = dist[x]+tu[x][i];
// dist2[i] = dist2[x]+w[x][i];
//dist2[i] = dist2[x]+1;
// Num[i] = 1;
// dist3[i] = dist3[x]+Kill[x];
// pre[i] = x;
}
}
}
}
}
int main()
{
int m,s,d,M;
cin>>n>>nn>>m>>M;
// string ss,dd;
// cin>>ss>>dd;
// n = n+nn;
for(int i=0;i<=n+nn;i++){
for(int j=0;j<=n+nn;j++){
if(i==j)continue;
tu[i][j] = inf;
}
}
// int u,v,l,ww;
// for(int i=1;i<=n+nn;i++){
//
// cin>>Kill[i];
//
// }
// for(int i=1;i<=m;i++){
//
// string s1,s2;
// int num;
// cin>>s1>>s2>>num;
// int i1 = id(s1);
// int i2 = id(s2);
// tu[i1][i2]= tu[i2][i1] = num;
// }
for(int i=1;i<=m;i++){
string uu,vv;
int l,u,v;
cin>>uu>>vv>>l;
u = id(uu);
v = id(vv);
// cout<<u<<" "<<v<<endl<<endl;
tu[u][v] = tu[v][u] = min(tu[u][v],l);
// w[u][v]= w[v][u] = ww;
}
double A =0,AA = inf;
int id =-1;
for(int i=1;i<=nn;i++){
f = 1;
dijkstra(n+i);
double ans =0;
double pp =inf;
// cout<<"i:"<<i<<endl;
// for(int j=1;j<=n;j++){
//
// cout<<dist[j]<<" ";
// }
// cout<<endl;
for(int j=1;j<=n;j++){
if(dist[j]>M){
f =0;
break;
}
pp = min(pp,1.0*dist[j]);
ans+=dist[j];
}
if(f){
if(pp>A){
A = pp;
AA = ans;
id = i;
}
else if(pp==A&&ans<AA){
A = pp;
AA = ans;
id =i;
}
}
}
if(id==-1){
printf("No Solution\n");
}
else{
printf("G%d\n%.1f %.1f",id,A,AA/n);
}
return 0;
}