版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/88828019
对每个垃圾桶暴力dijstra
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int map[1111][1111];
int vis[1111];
int dis[1111];
int n,m,k,ds;
void dijstra(int k)
{
for(int i=1;i<=n+m;i++)
{
vis[i]=0;dis[i]=INF;
}
dis[k]=0;
for(int i=1;i<=n+m;i++)
{
int max1=INF;
int t=-1;
for(int j=1;j<=m+n;j++)
{
if(!vis[j]&&dis[j]<max1)
{
max1=dis[j];
t=j;
}
}
if(t==-1) break;
vis[t]=1;
for(int j=1;j<=m+n;j++)
{
if(!vis[j]&&dis[t]+map[t][j]<dis[j])
dis[j]=dis[t]+map[t][j];
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&ds);
for(int i=0;i<1111;i++)
for(int j=0;j<1111;j++)
map[i][j]=INF;
for(int i=0;i<k;i++)
{
char str1[5],str2[5];
int t,x,y;
scanf("%s%s%d",str1,str2,&t);
if(str1[0]=='G')
{
x=0;
for(int j=1;str1[j]!='\0';j++)
x=x*10+str1[j]-'0';
x+=n;
}
else
{
x=0;
for(int j=0;str1[j]!='\0';j++)
x=x*10+str1[j]-'0';
}
if(str2[0]=='G')
{
y=0;
for(int j=1;str2[j]!='\0';j++)
y=y*10+str2[j]-'0';
y+=n;
}
else
{
y=0;
for(int j=0;str2[j]!='\0';j++)
y=y*10+str2[j]-'0';
}
map[x][y]=t;
map[y][x]=t;
}
int flag1=0;
int num1;
double sum1;
double max2=-1;
for(int i=n+1;i<=n+m;i++)
{
dijstra(i);
int flag=1;
double max1=1e18;
double sum=0;
for(int i=1;i<=n;i++)
{
if(dis[i]>ds)
{
flag=0;
break;
}
max1=min(max1,dis[i]*1.0);
sum+=dis[i]*1.0;
}
if(!flag) continue;
else
{
flag1=1;
if(max1>max2)
{
num1=i;
sum1=sum/(n*1.0);
max2=max1;
}
else if(max1==max2)
{
if((sum/(n*1.0))<sum1)
{
num1=i;
sum1=sum/(n*1.0);
}
else if((sum/(n*1.0))==sum1)
{
if(i<num1)
num1=i;
}
}
}
}
if(!flag1) printf("No Solution\n");
else
{
printf("G%d\n",num1-n);
printf("%.1lf %.1lf\n",max2,sum1);
}
return 0;
}