#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
using namespace std;
#define N 1010
struct road {
int next;
int dist;
road(int d1, int d2) : next(d1), dist(d2) {}
};
inline int uid(char str[], int n, int m) {
if(str[0] == 'G')
return atoi(str+1) - 1;
else
return atoi(str) - 1 + m;
}
void check(int src, int n, int m, vector<road> adj[], int md, int &station, int &fmd, double &ad) {
bool done[N] = {};
int dist[N] = {};
bool qualified = true;
done[src] = true;
int node = src;
int hc = 0;
while(true) {
for(int i = 0; i < adj[node].size(); i ++) {
road r = adj[node][i];
if(!done[r.next]) {
int tmpd = dist[node] + r.dist;
if(!dist[r.next] || tmpd < dist[r.next])
dist[r.next] = tmpd;
}
}
int mind = 0x7fffffff;
for(int i = 0; i < n+m; i ++) {
if(!done[i] && dist[i] && dist[i] < mind) {
node = i;
mind = dist[i];
}
}
if(node >= m && dist[node] > md) {
qualified = false;
break;
}
if(mind == 0x7fffffff)
break;
done[node] = true;
}
if(qualified) {
int mind = 0x7fffffff;
int td = 0;
for(int i = m; i < m+n; i ++) {
if(!done[i]) {
qualified = false;
break;
}
else {
if(dist[i] < mind)
mind = dist[i];
td += dist[i];
}
}
double tmpad = 1.0*td/n;
if(qualified && (mind > fmd || (mind == fmd && tmpad < ad))) {
station = src;
fmd = mind;
ad = tmpad;
}
}
}
int main(int argc, char **argv) {
int n, m, k, md;
cin >> n >> m >> k >> md;
vector<road> adj[N];
for(int i = 0; i < k; i ++) {
char str1[10], str2[10];
int dist;
scanf("%s%s%d", str1, str2, &dist);
int s1 = uid(str1, n, m), s2 = uid(str2, n, m);
adj[s1].push_back(road(s2, dist));
adj[s2].push_back(road(s1, dist));
}
int station = -1, fmd = -1;
double ad;
for(int i = 0; i < m; i ++) {
check(i, n, m, adj, md, station, fmd, ad);
}
if(station >= 0) {
printf("G%d\n%d.0 %.1lf\n", station+1, fmd, ad);
}
else {
printf("No Solution\n");
}
return 0;
}
1072. Gas Station (30)
最新推荐文章于 2021-09-08 09:26:46 发布