解析
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int INF = 0x3fffffff;
struct Node {
int v, dis;
Node() = default;
Node(int _v,int _dis):v(_v),dis(_dis){}
};
vector<vector<Node>> G;
unordered_map<string, int> Gas2index;
unordered_map<int, string> index2Gas;
void Dijkstra(int s,vector<int>& d) {
vector<bool> vis(G.size(), false);
d.resize(G.size(), INF);
d[s] = 0;
for (int i = 1; i < G.size(); i++) {
int u = -1, min = INF;
for (int j = 1; j < G.size(); j++) {
if (vis[j] == false && d[j] < min) {
min = d[j];
u = j;
}
}
vis[u] = true;
for (auto x : G[u]) {
int v = x.v;
if (vis[v] == false) {
if (d[v] > d[u] + x.dis) {
d[v] = d[u] + x.dis;
}
}
}
}
}
int main()
{
int N, M, K, Ds;
scanf("%d %d %d %d", &N, &M, &K, &Ds);
G.resize(N + 1 + M); //1~N is house,N+1~N+M-1 is gas
for (int i = 0; i < M; i++) {
Gas2index[string("G") + to_string(i + 1)] = N + i + 1;
index2Gas[N + i + 1] = string("G") + to_string(i + 1);
}
string c1, c2;
int C1,C2,dis;
for (int i = 0; i < K; i++) {
cin >> c1 >> c2 >> dis;
if (c1[0] == 'G')
C1 = Gas2index[c1];
else
C1 = stoi(c1);
if (c2[0] == 'G')
C2 = Gas2index[c2];
else
C2 = stoi(c2);
if (C1 != C2) {
G[C1].push_back(Node(C2, dis));
G[C2].push_back(Node(C1, dis));
}
}
int index = -1;
pair<int, double> data(-1,INF); //min, average;
for (int i = N + 1; i < N + M+1; i++) {
vector<int> d;
Dijkstra(i,d);
int max = *max_element(d.begin() + 1, d.begin() + N + 1);
if (max > Ds)
continue;
int min = *min_element(d.begin() + 1, d.begin() + N + 1);
double avg = 0.0;
for (auto it = d.begin() + 1; it != d.begin() + N + 1; it++)
avg += *it;
if (data.first < min) {
data.first = min;
data.second = avg;
index = i;
}
else if (data.first == min && data.second > avg) {
data.second = avg;
index = i;
}
}
if (index == -1)
printf("No Solution");
else
printf("%s\n%.1f %.1f", index2Gas[index].c_str(), (double)data.first, data.second/N);
return 0;
}