#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1011;
typedef pair<int,int> pii;
int n,m,k,ds;
struct edge{
int from,to,w;
edge(int u,int v,int w):from(u),to(v),w(w){}
};
struct garbage{
double mmin;
double sum;
double num;
}a[maxn];
vector<edge> e;
vector<int> g[maxn];
int d[maxn];
bool cmp(garbage a,garbage b){
if(a.mmin==b.mmin){
if(a.sum==b.sum){
return a.num<b.num;
}
else return a.sum<b.sum;
}
else return a.mmin>b.mmin;
}
int fun(string s){
if(s[0]=='G') return stoi(s.substr(1))+n;
else return stoi(s.substr(0));
}
void dj(int s){
fill(d,d+maxn,inf);
d[s]=0;
priority_queue<pii,vector<pii>,greater<pii> > q;
q.push((pii){0,s});
while(!q.empty()){
pii x=q.top();
q.pop();
int u=x.second;
if(d[u]!=x.first) continue;
for(int i=0;i<g[u].size();i++){
edge&t=e[g[u][i]];
if(d[t.to]>d[u]+t.w){
d[t.to]=d[u]+t.w;
q.push((pii){d[t.to],t.to});
}
}
}
}
int main(){
cin>>n>>m>>k>>ds;
int temp=0;
while(k--){
string s,t;
int x,y,w;
cin>>s>>t>>w;
x=fun(s);
y=fun(t);
e.push_back(edge(x,y,w));
e.push_back(edge(y,x,w));
g[x].push_back(temp++);
g[y].push_back(temp++);
}
int cnt=0;
for(int i=n+1;i<=n+m;i++){
dj(i);
int minn=inf,t=0,flag=0;
for(int j=1;j<=n;j++){
if(d[j]>ds) flag=1;
minn=min(d[j],minn);
t+=d[j];
}
if(flag) continue;
a[cnt].mmin=minn;
a[cnt].sum=t;
a[cnt++].num=i-n;
}
sort(a,a+cnt,cmp);
if(cnt==0) cout<<"No Solution"<<endl;
else {
cout<<'G'<<a[0].num<<endl;
printf("%.1lf %.1lf",a[0].mmin,a[0].sum/n);
}
return 0;
}
垃圾箱分布 (30 分)
最新推荐文章于 2025-04-15 17:11:19 发布