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; }