#include <bits/stdc++.h>
using namespace std;
const int N = 1020;
const int INF = 0x3f3f3f3f;
int n, m, S, T, k, r;
int g[N][N], dist[N];
bool st[N];
int get(string str)
{
if (str[0] == 'G')
return n + stoi(str.substr(1));
return stoi(str);
}
void dijkstra(int start, int& minD, int& minSum)
{
memset(dist, 0x3f, sizeof dist);
memset(st, false, sizeof st);
dist[start] = 0;
for (int i = 0; i < n + k; i++)
{
int t = -1;
for (int j = 1; j <= n + k; j++)
if (!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
st[t] = true;
for (int j = 1; j <= n + k; j++)
{
if (dist[j] > dist[t] + g[t][j])
dist[j] = dist[t] + g[t][j];
}
}
for (int i = 1; i <= n; i++)
{
if (dist[i] > r)
{
minD = -INF;
return;
}
}
minD = INF, minSum = 0;
for (int i = 1; i <= n; i++)
{
if (dist[i] < minD) minD = dist[i];
minSum += dist[i];
}
}
int main()
{
memset(g, 0x3f, sizeof g);
cin >> n >> k >> m >> r; // n屋m路k加油站r范围
for (int i = 0; i < m; i++)
{
string a, b;
int d;
cin >> a >> b >> d;
int x = get(a), y = get(b);
g[x][y] = g[y][x] = d;
}
int minDist = 0, minSum = INF, res = -1;
for (int i = n + 1; i <= n + k; i++)
{
int d1, d2; //该加油站与房屋的最短距离和距离之和
dijkstra(i, d1, d2);
if (d1 > minDist) minDist = d1, minSum = d2, res = i;
if (d1 == minDist && d2 < minSum) minSum = d2, res = i;
}
if (res == -1) puts("No Solution");
else printf("G%d\n%.1f %.1f", res - n, double(minDist), double(minSum) / n + 1e-8);
}
【PAT甲级】1072 Gas Station(Dijkstra、枚举)
最新推荐文章于 2024-05-20 20:08:58 发布