这个题纯敲代码就花了30min,结果又斗争了半小时最后一个样例还是不对,看了别人的AC代码把+0.05四舍五入去了结果对了,所以PAT的题要是错了可以试试不写四舍五入。
#include<bits/stdc++.h> using namespace std; const int inf = 1e9; vector<vector<int>> g; vector<int> visit, d; int main() { int n, m, k, ds; int h,r; set<int> l; int i,j,t; int s1, s2; int loc = 0, house = inf, sq = inf; string c1,c2; cin >> n >> m >> k >> ds; g.resize(n + 1+m); for (i = 1; i<=n+m; ++i) g[i].resize(n + 1+m,inf); visit.resize(n + 1+m,0); d.resize(n + 1+m, inf); for (i = 0; i < k; ++i) { cin >> c1 >> c2 >> t; if (c1[0]=='G'){ c1 = c1.substr(1); s1 = stoi(c1)+n; } else s1 = stoi(c1); if (c2[0] == 'G'){ c2 = c2.substr(1); s2 = stoi(c2)+n; } else s2 = stoi(c2); g[s1][s2] = t; g[s2][s1] = t; } int flag = 0; for (t = 1; t<=m; ++t) { fill(d.begin(), d.end(), inf); fill(visit.begin(), visit.end(), 0); d[n + t] = 0; h = 0; for (i = 1; i <= n + m; ++i) { int u = -1; int mini = inf; for (j = 1; j<= n + m; ++j) if(!visit[j]&&d[j]<mini) { u=j; mini = d[j]; } if(u==-1) break; visit[u] = 1; for (j = 1; j<= n + m; ++j) { if(!visit[j]) { if (d[u] + g[u][j] <d[j]) { d[j] = d[u] + g[u][j]; } } } } l.clear(); for (i = 1; i <= n; ++i) { h += d[i]; if (d[i] > ds) { flag = 1; break; } else flag = 0; l.insert(d[i]); // printf("\nG%dto%d:%d ", t, i, d[i]); } if (flag == 1) continue; r = *l.begin(); if (r > loc) { loc = r; house = h; sq = t; } else if (r == loc) { if (h < house){ house = h; sq = t; } else if (h == house) if (t < sq){ sq = t; } } // printf("\nloc%dhouse%d\n", loc, house); } if (flag == 1) printf("No Solution"); else{ printf("G%d\n", sq); printf("%.1f %.1f", loc*1.0, house * 1.0 / n /*+ 0.05*/); } return 0; }