PAT 1072 Gas Station SPFA

来源:互联网 发布:cad编程视频 编辑:程序博客网 时间:2024/05/14 06:01
//妈蛋,当时有个下标写错了...
#include<algorithm>#include<cstdio>#include<iostream>#include<string>#include<cstring>#include<vector>#include<set>#include<map>#include<queue>#define ll long longusing namespace std;int n,m,k,d;int g[1100][1100],in[1100],dis[1100];int get(char *s){if(s[0]!='G')return atoi(s);if(strlen(s) == 3)return n+10;else return n+s[1]-'0';}void spfa(int bg){queue<int>q;memset(in,0,sizeof(in));memset(dis,0x7f,sizeof(dis));in[bg] = 1;dis[bg] = 0;q.push(bg);while(!q.empty()){int u = q.front();q.pop();in[u] = 0;for(int i = 1;i<=n+m;i++){if(g[u][i] == -1)continue;if(dis[i]>dis[u]+g[u][i]){dis[i] = dis[u]+g[u][i];if(!in[i]){q.push(i);in[i] = 1;}}}}}int main(){char s1[10],s2[10];int i,j,x,y,z;while(scanf("%d%d%d%d",&n,&m,&k,&d)!=EOF){memset(g,-1,sizeof(g));for(i = 0;i<k;i++){scanf("%s%s%d",s1,s2,&x);g[get(s1)][get(s2)] = g[get(s2)][get(s1)] = x;}int mx = -1,sum = 1e9,ans = -1;for(i = n+1;i<=n+m;i++){int mn = 1e9,total = 0,f = 1;spfa(i);for(j = 1;j<=n;j++){if(dis[j]>d){f = 0;break;}mn = min(mn,dis[j]);total+=dis[j];}if(!f)continue;if(mn>mx||(mn==mx&&total<sum)){mx = mn;sum = total;ans = i;}}if(ans == -1)printf("No Solution\n");else printf("G%d\n%.1lf %.1lf\n",ans-n,(double)mx,(double)sum/(double)n);}return 0;}


                                             
0 0
原创粉丝点击