https://pintia.cn/problem-sets/994805046380707840/problems/994805052131098624
1.dij求到垃圾箱到每个点的最短距离
2.优先选择最短距离最大
3.其次平均距离小
4.再数字小
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
const int inf=0x3f3f3f3f;
int head[maxn],e[maxn],ne[maxn],w[maxn];
int dis[maxn];
int st[maxn];
int cnt=0;
void add(int x,int y,int z)
{
e[++cnt]=y;
w[cnt]=z;
ne[cnt]=head[x];
head[x]=cnt;
}
int n,m,k;
int ds;
typedef pair<int,int> PII;
void dij(int pos)
{
for(int i=1;i<=n+m;i++)
dis[i]=inf;
dis[pos]=0;
memset(st,0,sizeof(st));
priority_queue<PII,vector<PII>,greater<PII>> qu;
qu.push({0,pos});
while(!qu.empty())
{
PII t=qu.top();
qu.pop();
int ver=t.second,distance=t.first;
if(st[ver])
continue;
st[ver]=1;
for(int i=head[ver];i;i=ne[i])
{
int j=e[i];
if(dis[j]>distance+w[i])
{
dis[j]=distance+w[i];
qu.push({dis[j],j});
}
}
}
}
//第一个垃圾桶用n+1来表示
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&ds);
getchar();
for(int i=1;i<=k;i++)
{
int x[4];
int ww=0;
string s;
getline(cin,s);
int te=0;
int fg=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='G')
{
fg=1;
}
else if(s[i]>='0'&&s[i]<='9')
te=te*10+s[i]-'0';
else
{ if(fg)
{
te+=n;
fg=0;
}
x[ww++]=te;
te=0;
}
}
if(fg)
{
te+=n;
fg=0;
}
x[ww++]=te;
add(x[0],x[1],x[2]);
add(x[1],x[0],x[2]);
}
int ans=-1;
double ave=-1;
int fm=-1;
for(int i=n+1;i<=n+m;i++)
{
dij(i);
int fg=1;
int sum=0;
int mm=inf;
for(int j=1;j<=n;j++)
{
mm=min(mm,dis[j]);
if(dis[j]>ds)
{
fg=0;
break;
}
else
sum+=dis[j];
}
if(fg)
{ double te=sum*1.0/n;
if(fm==-1)
{
ave=te;
ans=i;
fm=mm;
}
else if(mm>fm)
{
ave=te;
ans=i;
fm=mm;
}
else if(mm==fm)
{
if(te<ave)
{
ave=te;
ans=i;
}
else if(te==ave)
{
if(i<ans)
ans=i;
}
}
}
}
if(ans==-1)
printf("No Solution\n");
else
{
printf("G%d\n",ans-n);
double r=fm;
printf("%.1f %.1f\n",r,ave);
}
}
在这里插入代码片