这个题错在没有给vis赋初值,讲道理,我检查了50分钟bug啥也没发现,又重新写了一遍,结果第一遍的加上初值给过了。。。而且样例很坑,dev出来应该是3.2。。
因为之前做过的题不赋初值也能过。。
这个不赋就给2分。。
还有一个点是string可能是G10,别只读一位。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1020;
const int INF=1000000000;
int g[maxn][maxn];
int n,m,k,ds;
int s2i(string str){
if(str[0]=='G')return stoi(str.substr(1,str.size()-1))+n;
else return stoi(str);
}
int d[maxn];
bool vis[maxn]={};
void dijkstra(int s){
fill(vis,vis+maxn,false);
fill(d,d+maxn,INF);
d[s]=0;
for(int i=1;i<=n+m;i++){
int minn=INF,u=-1;
for(int j=1;j<=n+m;j++){
if(vis[j]==false&&d[j]<minn){
minn=d[j];
u=j;
}
}
if(u==-1)return;
vis[u]=true;
for(int v=1;v<=m+n;v++){
if(g[v][u]!=INF&&vis[v]==false){
if(d[v]>d[u]+g[u][v]){
d[v]=d[u]+g[u][v];
}
}
}
}
}
int main(){
fill(g[0],g[0]+maxn*maxn,INF);
cin>>n>>m>>k>>ds;
string a,b;
int ta,tb,l;//存在n+1-n+m,
for(int i=0;i<k;i++){
cin>>a>>b>>l;
ta=s2i(a);
tb=s2i(b);
g[ta][tb]=l;
g[tb][ta]=l;
}
double MIN=0,AVG=INF;
int tag=-1;
for(int i=1+n;i<=n+m;i++){
dijkstra(i);
double sum=0,minn=INF;
for(int j=1;j<=n;j++){
if(d[j]>ds){
minn=-1;
break;
}
sum+=1.0*d[j]/n;
if(d[j]<minn){
minn=d[j];
}
}
if(minn>MIN){
MIN=minn;
tag=i;
AVG=sum;
}
else if(minn==MIN&&sum<AVG){
MIN=minn;
tag=i;
AVG=sum;
}
}
if(tag==-1)printf("No Solution\n");
else{
printf("G%d\n",tag-n);
printf("%.1f %.1f\n",MIN,AVG);
}
return 0;
}