PAT-甲级-1072 Gas Station (30 分)

60 篇文章 0 订阅

1072 Gas Station (30 分)

#include <iostream>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#define rep(i,j,k)    for(int i=j;i<k;i++)
using namespace std;
const int maxn=1100,inf=999999999;
int e[maxn][maxn],dis[maxn],vis[maxn];

int main(){
    int n,m,k,t,d,p,q;
    string a,b;
    cin>>n>>m>>k>>t;
    fill(e[0],e[0]+maxn*maxn,inf);
    fill(dis,dis+maxn,inf);
    rep(i,0,k){
        cin>>a>>b>>d;
        if(a[0]=='G'){
            a=a.substr(1);
            p = stoi(a)+n;
        }else p = stoi(a);
        if(b[0]=='G'){
            b=b.substr(1);
            q = stoi(b)+n;
        }else q = stoi(b);
        e[p][q]=e[q][p]=d;
    }
    double ansdis=-1,ansavg=inf;
    int ansid = -1;
    rep(index,n+1,n+m+1){
        double mindis=inf,avg=0;
        fill(dis,dis+maxn,inf);
        fill(vis,vis+maxn,0);
        dis[index]=0;
        rep(i,0,n+m){
            int u=-1,minn=inf;
            rep(j,1,n+m+1){
                if(vis[j]==0 && minn>dis[j]){
                    u = j;
                    minn = dis[j];
                }
            }
            if(u==-1)    break;
            vis[u] = 1;
            rep(v,1,n+m+1){
                if(vis[v]==0 && dis[v] > dis[u]+e[u][v])
                    dis[v]=dis[u]+e[u][v];
            }
        }
        rep(i,1,n+1){
            if(dis[i]>t){
                mindis=-1;
                break;
            }
            if(mindis>dis[i])
                mindis = dis[i];
            avg += 1.0 * dis[i];
        }
        if(mindis==-1)    continue;
        avg /= n;
        if(ansdis<mindis){
            ansdis = mindis;
            ansid=index;
            ansavg = avg;
        }else if(ansdis==mindis && ansavg > avg){
            ansid=index;
            ansavg = avg;
        }
    }
    if(ansid==-1)
        printf("No Solution");
    else
        printf("G%d\n%.1f %.1f",ansid-n,ansdis,ansavg);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值