求油站到房子的距离的最小值最大,如果相同,则优先考虑油站到各个房子距离之和的最小值,如果仍相同,则输出Id小的。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 999999999
using namespace std;
int a[1100][1100];
int mark1[15];
struct station
{
int id;
int m_hou;
int ave;
};
station uu[15];
int dist[1100];
int mark[1100];
int n,m,k,d;
void dij(int x)
{
memset(mark,0,sizeof(mark));
for(int i=1;i<=n+m;i++)
{
dist[i]=a[x][i];
}
mark[x]=1;
for(int i=0;i<n+m-1;i++)
{
int biaoji=x;
int minn=inf;
for(int j=1;j<=m+n;j++)
{
if(mark[j]==0&&dist[j]<minn)
{
biaoji=j;
minn=dist[j];
}
}
mark[biaoji]=1;
for(int j=1;j<=m+n;j++)
{
if(mark[j]==0&&a[biaoji][j]<inf&&dist[biaoji]+a[biaoji][j]<dist[j])
{
dist[j]=dist[biaoji]+a[biaoji][j];
}
}
}
int xiao=inf;
int tt=0;
for(int i=1;i<=n;i++)
{
if(dist[i]>d)
{
mark1[x-n]=1;
return ;
}
if(dist[i]<xiao)
{
xiao=dist[i];
}
tt+=dist[i];
}
uu[x-n].m_hou=xiao;
uu[x-n].ave=tt;
uu[x-n].id=x-n;
}
bool cmp(station x,station y)
{
if(x.m_hou!=y.m_hou)
{
return x.m_hou>y.m_hou;
}
else
{
if(x.ave!=y.ave)
return x.ave<y.ave;
else
return x.id<y.id;
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&k,&d);
for(int i=1;i<=m+n;i++)
{
for(int j=1;j<=m+n;j++)
{
if(i==j) a[i][j]=0;
else
a[i][j]=inf;
}
}
for(int i=0;i<k;i++)
{
char s[8];
char s1[8];
int dis;
scanf("%s %s %d",s,s1,&dis);
//cout<<s<<" "<<s1<<" "<<dis<<endl;
int l=0,r=0;
if(s[0]=='G')
{
for(int j=1;j<strlen(s);j++)
{
l*=10;
l+=s[j]-'0';
}
l+=n;
}
else
{
for(int j=0;j<strlen(s);j++)
{
l*=10;
l+=s[j]-'0';
}
}
//cout<<l<<endl;
if(s1[0]=='G')
{
for(int j=1;j<strlen(s1);j++)
{
r*=10;
r+=s1[j]-'0';
}
r+=n;
}
else
{
for(int j=0;j<strlen(s1);j++)
{
r*=10;
r+=s1[j]-'0';
}
}
//cout<<r<<endl;
a[l][r]=a[r][l]=dis;
}
for(int i=1;i<=m;i++)
{
dij(i+n);
}
//cout<<1<<endl;
station ans[15];
int num=0;
for(int i=1;i<=m;i++)
{
if(mark1[i]==0)
{
ans[num++]=uu[i];
}
}
if(num==0)
{
printf("No Solution");
}
else
{
sort(ans,ans+num,cmp);
printf("G%d\n",ans[0].id);
printf("%.1f %.1f",(float)ans[0].m_hou,(float)(ans[0].ave*1.0/n));
}
}