1072 Gas Station (30 分)
思路有空更新
#include <iostream>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
int map[1050][1050], vis[1050], dis[1050];
int n, m, k, ds;
void dijkstra(int s){
memset(vis, 0, sizeof vis);
memset(dis, inf, sizeof dis);
dis[s] = 0;
for(int i = 0; i < n + m; ++i){
int t = -1;
for(int j = 1; j <= n + m; ++j)
if(!vis[j] && (t == -1 || dis[j] < dis[t]))
t = j;
vis[t] = 1;
for(int j = 1; j <= n + m; ++j)
dis[j] = min(dis[j], dis[t] + map[t][j]);
}
}
int main() {
cin >> n >> m >> k >> ds;
memset(map, inf, sizeof map);
for(int i = 1; i <= n + m; ++i)
map[i][i] = 0;
while(k--) {
string a, b;
int x, y, z;
cin >> a >> b >> z;
if(a[0] == 'G') x = stoi(a.substr(1)) + n;
else x = stoi(a);
if(b[0] == 'G') y = stoi(b.substr(1)) + n;
else y = stoi(b);
map[x][y] = map[y][x] = z;
}
int index;
double minv = inf, minD = 0;
for(int i = n + 1; i <= n + m; ++i){
dijkstra(i);
int mind = inf, f = 1;
double sum = 0;
for(int j = 1; j <= n; ++j){
if(dis[j] > ds){
f = 0;break;
}
mind = min(mind, dis[j]);
sum += dis[j];
}
if(f == 0) continue;
if(mind > minD){
minD = mind;
minv = sum / n;
index = i;
}
else if(mind == minD && sum / n < minv){
minv = sum / n;
index = i;
}
}
if(minv == inf)
cout << "No Solution";
else
printf("G%d\n%.1lf %.1lf", index - n, minD, minv + 1e-6);
}