【PAT】1072. Gas Station

来源:互联网 发布:撤销中国根域名服务器 编辑:程序博客网 时间:2024/05/21 11:20

考查点:Dijkstra算法

思路:第一次输入少了&,第二次本题是1到n+m,缺少了+m,还有id转化两次写错,第一次==写错成=,第二次忽视了数字为多位数的情况,浪费时间最多的是调用ds时应该从起点s+n而不是s+m,另外,本题最求最大的最近距离,变量应设为里dmax里面才是dmin

#define LOCAL#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#define FOR(i, x, y) for(int i = x; i <= y; i++)#define rFOR(i, x, y) for(int i = x; i >= y; i--)#define MAX 1030#define oo 0x3f3f3f3fusing namespace std;int G[MAX][MAX],pre[MAX],dis[MAX],vis[MAX],n,m;int change(char str[]){    int i=0,len=strlen(str),id=0;    while(i<len){        if(str[i]!='G'){            id=id*10+str[i]-'0';        }        i++;    }    if(str[0]=='G')return id+n;    else return id;}void DJ(int s){    fill(dis,dis+MAX,oo);    memset(vis,0,sizeof(vis));    dis[s]=0;    for(int i=0;i<n+m;i++){        int MIN=oo;        int u=-1;        for(int j=1;j<=n+m;j++)        {            if(vis[j]==0&&dis[j]<MIN){                MIN=dis[j];                u=j;            }        }        if(u==-1) return;        vis[u]=1;        for(int v=1;v<=n+m;v++){            if(vis[v]==0&&G[u][v]!=oo){                if(dis[v]>G[u][v]+dis[u]){                    dis[v]=dis[u]+G[u][v];                }            }        }    }}int main(){     #ifdef LOCAL        freopen("data.in","r",stdin);        freopen("data.out","w",stdout);    #endif // LOCAL    int k,ds;    fill(G[0],G[0]+MAX*MAX,oo);    scanf("%d%d%d%d",&n,&m,&k,&ds);    char str[5],st[5];    int x;    for(int i=0;i<k;i++)    {        scanf("%s %s %d",str,st,&x);        int id1=change(str);        int id2=change(st);        G[id1][id2]=G[id2][id1]=x;    }    double dmax=-1,avg=0;int ans=-1;    FOR(s,1,m)    {        double tmin=oo,tavg=0;               DJ(s+n);        FOR(i,1,n){            if(dis[i]<=ds){                tavg+=dis[i];                if(dis[i]<tmin) tmin=dis[i];            }else{                tmin=oo;break;            }        }        if(tmin!=oo){            if(dmax<tmin){                ans=s,dmax=tmin,avg=tavg;            }else if(dmax==tmin){                if(avg>tavg){                    ans=s,dmax=tmin,avg=tavg;                }            }        }    }    if(ans==-1)printf("No Solution");    else{        printf("G%d\n%.1f %.1f",ans,dmax,avg/n);    }    return 0;}


0 0
原创粉丝点击