PAT1072. Gas Station (30)
题目的测试用例数据有问题!
第一个Case 应该是
G1
2.0 3.2
一直在想3.3分母的3怎么来了。ORZ
#include <iostream> #include <cctype> #include <limits> #include <cstdlib> #include <string> #include <stdio.h> using namespace std; int ma[1020][1020]; int num[1020]; int n,m,k,ds; int i,j; int INF=numeric_limits<int>::max(); int dp[1020]; int vis[1020]; // station --- house 最小距离越大越好 void djkstra(int gx){ for(i=0;i<1020;i++){ dp[i]=INF; vis[i]=0; } dp[gx]=0; for(i=1;i<=m+n;i++){ int x,mm=INF; for(j=1;j<1020;j++){ if(num[j]!=0){ if(!vis[j]&&dp[j]<mm){ mm=dp[x=j]; } } } vis[x]=1; for(j=1;j<1020;j++){ if(num[j]!=0){ if(ma[x][j]!=0){ if(dp[x]+ma[x][j]<dp[j]){ dp[j]=dp[x]+ma[x][j]; } } } } } } // minimum distance in service range smallest average int main() { cin>>n>>m>>k>>ds; for(i=1;i<=n;i++) num[i+10]=1; for(i=1;i<=m;i++) num[i]=1; for(i=0;i<k;i++){ string p1,p2; int dist; int a,b; cin>>p1>>p2>>dist; if(isdigit(p1[0])) a=atoi(p1.data())+10; else { a=atoi(p1.substr(1).data()); } if(isdigit(p2[0])) b=atoi(p2.data())+10; else { b=atoi(p2.substr(1).data()); } ma[a][b]=ma[b][a]=dist; } int disMinA=-1; int sumDisA=0; int inde=INF;int t; int isInA=0; for(t=1;t<=m;t++){ djkstra(t); // distance is set find minimum int isIn=1; int disMin=INF; int sumDis=0; for(int p=1;p<=n;p++){ if(dp[p+10]>ds){ isIn=0; break; } } if(isIn){ isInA=1; for(int p=1;p<=n;p++){ sumDis+=dp[p+10]; if(disMin>dp[p+10]) disMin=dp[p+10]; } if(disMin>disMinA){ disMinA=disMin; sumDisA=sumDis; inde=t; }else if(disMin==disMinA){ if(sumDis<sumDisA){ inde=t;sumDisA=sumDis; }else if(sumDis==sumDisA){ if(inde>t) inde=t; } } } } if(isInA){ cout<<"G"<<inde<<endl; printf("%.1f %.1f\n",disMinA+0.0,(sumDisA+0.0)/n); }else{ cout<<"No Solution"<<endl; } return 0; }