题意:
输入四个正整数N,M,K,D(N<=1000,M<=10,K<=10000)分别表示房屋个数,加油站个数,路径条数和加油站最远服务距离,接着输入K行每行包括一条路的两条边和距离。输出最近距离最远同时与所有房屋距离都不超过D的加油站名字和最近距离以及平均距离。如果有多个答案则优先输出平均距离最小的,再不唯一则输出编号最小的。
trick:
这题有一个诡异的事情,样例1的平均距离是3.25,取一位小数应该是3.2,四舍五入则是3.3,样例显示为3.3,此时我理解为四舍五入,题面说是精确到1位小数。
当我将ans+0.05时测试点4会不过,当我直接舍入时AC样例却输出3.2。??。。。
代码:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> >edge[1017];
int dis[1017],vis[1017];
int sum[17],mnn[17],mxx[17];
void Dijkstra(int x){
    dis[x]=0;
    priority_queue<pair<int,int> >pq;
    pq.push({0,x});
    while(!pq.empty()){
        int now=pq.top().second;
        pq.pop();
        if(vis[now])
            continue;
        vis[now]=1;
        for(int i=0;i<edge[now].size();++i){
            int v=edge[now][i].first;
            if(!vis[v]&&dis[v]>dis[now]+edge[now][i].second){
                dis[v]=dis[now]+edge[now][i].second;
                pq.push({-dis[v],v});
            }
        }
    }
}
int main(){
    //ios::sync_with_stdio(false);
    //cin.tie(NULL);
    //cout.tie(NULL);
    for(int i=1;i<=10;++i)
        mnn[i]=1e9+7;
    int n,m,k,d;
    scanf("%d%d%d%d",&n,&m,&k,&d);
    for(int i=1;i<=k;++i){
        int u=0,v=0,w;
        char s1[5],s2[5];
        scanf("%s%s%d",s1,s2,&w);
        if(s1[0]==‘G‘){
            if(s1[2]==‘0‘)
                u=1010;
            else
                u=1000+s1[1]-‘0‘;
        }
        else{
            for(int j=0;j<strlen(s1);++j){
                u*=10;
                u+=s1[j]-‘0‘;
            }
        }
        if(s2[0]==‘G‘){
            if(s2[2]==‘0‘)
                v=1010;
            else
                v=1000+s2[1]-‘0‘;
        }
        else{
            for(int j=0;j<strlen(s2);++j){
                v*=10;
                v+=s2[j]-‘0‘;
            }
        }
        edge[u].push_back({v,w});
        edge[v].push_back({u,w});
    }
    int mn=0,pos=0,mnnn=0;
    for(int i=1;i<=m;++i){
        for(int j=1;j<=1010;++j)
            dis[j]=1e9+7,vis[j]=0;
        Dijkstra(i+1000);
        for(int j=1;j<=n;++j){
            sum[i]+=dis[j];
            mnn[i]=min(mnn[i],dis[j]);
            mxx[i]=max(mxx[i],dis[j]);
        }
        if(mxx[i]<=d&&mnn[i]>=mnnn){
            if(mnn[i]>mnnn){
                mn=sum[i];
                pos=i;
                mnnn=mnn[i];
            }
            else if(mnn[i]==mnnn&&sum[i]<mn){
                mn=sum[i];
                pos=i;
            }
        }
    }
    double ans=1.0*mn/n;
    if(pos){
        printf("G%d\n",pos);
        printf("%d.0 %.1lf",mnnn,ans);
    }
    else
        printf("No Solution");
    return 0;
}
【PAT甲级】1072 Gas Station (30 分)(Dijkstra)
原文:https://www.cnblogs.com/ldudxy/p/11798889.html