吐血。。。。
做这个题的时候人飘了,题目意思都没读清楚就去写了,导致有一个条件忽略掉了,就是:
If there are more than one solution, output the one with the smallest average distance to all the houses.
也就是说,首先找 最短距离最大者,若相同则选择均值较大者,其次是下标顺序。。。。
附本人AC代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
const int inf = 100000000;
int N, M, K, D, len, t1, t2;
int map[1020][1020], dis[1020];
bool flag[1020];
vector<vector<int>>V;
void dijistra(int x) {
fill(dis, dis + 1020, inf);
fill(flag, flag + 1020, false);
dis[x] = 0;
for (int i = 1; i <= M + N; i++) {
int index = -1, mini = inf;
for (int j = 1; j <= N + M ; j++) {
if (flag[j] == false && dis[j] < mini) {
mini = dis[j];
index = j;
}
}
if (index == -1)return;
flag[index] = true;
for (int j = 1; j <= N + M; j++) {
if(flag[j]==false&&map[index][j] != inf) {
if (dis[j] > dis[index] + map[index][j]) {
dis[j] = dis[index] + map[index][j];
}
}
}
}
}
int main() {
fill(map[0], map[0] + 1020 * 1020, inf);
string s1, s2;
scanf("%d%d%d%d", &N, &M, &K, &D);
V.resize(N + M + 1);
for (int i = 0; i < K; i++) {
cin.ignore();
cin >> s1 >> s2;
scanf("%d", &len);
if (s1[0] == 'G')t1 = N + stoi(s1.substr(1));
else t1 = stoi(s1);
if (s2[0] == 'G')t2 = N + stoi(s2.substr(1));
else t2 = stoi(s2);
map[t1][t2] = map[t2][t1] = len;
}
int index, fsum = -1, fmini = -1;
for (int i = N + 1; i <= N + M; i++) {
dijistra(i);
int sum = 0, mini = D + 1, tflag = 0;
for (int j = 1; j <= N; j++) {
if (dis[j] > D) {
tflag = 1;
break;
}
sum += dis[j];
if (dis[j] < mini)mini = dis[j];
}
if (tflag == 1)continue;
if (mini == D + 1)continue;
if (mini > fmini) {
fsum = sum;
index = i;
fmini = mini;
}
else if (mini == fmini && sum < fsum) {
fsum = sum;
index = i;
}
}
if (fmini == -1)printf("No Solution\n");
else printf("G%d\n%.1lf %.1lf", index - N, (double)fmini, (double)fsum / N);
return 0;
}