PAT1072. Gas Station

最多只有一个加油站符合,所以把所有加油站存起来是不必要的,保存一个当前加油站即可

#include<cstdio>
#include<algorithm>
#include<numeric>
using namespace std;
const int N=1020,M=0x0fffffff;
int n,m,k,limit;
int dis[N][N],site,gtotal,gmin;
void check(int k)
{
    int dist[N];
    bool used[N];
    fill_n(used,N,false);
    fill_n(dist,N,M);
    dist[k]=0;
    while(true)
    {
        int t=-1;
        for(int mmin=M,i=0;i<n+m;++i)
            if(!used[i]&&dist[i]<mmin)
                mmin=dist[t=i];
        if(-1==t)break;
        used[t]=true;
        for(int i=0;i<n+m;++i)
            if(dis[t][i]!=M&&(dist[i]>dist[t]+dis[t][i]))
                    dist[i]=dist[t]+dis[t][i];
    }
    if(*max_element(dist,dist+n)<=limit)
    {
        int a=accumulate(dist,dist+n,0);
        int b=*min_element(dist,dist+n);
        if(b>gmin)
            {gmin=b;gtotal=a;site=k;}
        else if(b==gmin)
        {
            if(a<gtotal)
                {gtotal=a;site=k;}
            else if(a==gtotal&&k<site)
                site=k;
        }
    }
}
int no(){
    char s[7];
    scanf("%s",s);
    if(s[0]=='G')   return atoi(s+1)+n-1;
    return atoi(s)-1;
}
int main()
{
    fill_n(*dis,N*N,M);
    scanf("%d%d%d%d",&n,&m,&k,&limit);
    while(k--)
    {
        int a=no(),b=no();
        scanf("%d",&dis[b][a]);
        dis[a][b]=dis[b][a];
    }
    for(int i=n;i<m+n;++i)
        check(i);
    if(!site)
        printf("No Solution\n");
    else
        printf("G%d\n%d.0 %.1f\n", site+1-n,gmin,(double)gtotal/n);
    return 0;
}

你可能感兴趣的:(PAT1072. Gas Station)