#include <iostream>
#include <unordered_map>
#include <cstring>
#include <vector>
using namespace std;
const int N = 300;
int n, k;
bool st[N];
int g[N][N], w[N];
string city[N];
int cost[N], cnt[N], sum[N], dist[N], pre[N];
unordered_map<string, int>mp;
void dijkstra()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0, cnt[1]=1;
for (int i = 0; i < n; i++)
{
int t = -1;
for (int j = 1; j <= n; j++)
if (!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
st[t] = true;
for (int j = 1; j <= n; j++)
{
if (dist[j] > dist[t] + g[t][j])
{
dist[j] = dist[t] + g[t][j];
cnt[j] = cnt[t];
cost[j] = cost[t] + w[j];
sum[j] = sum[t] + 1;
pre[j] = t;
}
else if (dist[j] == dist[t] + g[t][j])
{
cnt[j] += cnt[t];
if (cost[j] < cost[t] + w[j])
{
cost[j] = cost[t] + w[j];
sum[j] = sum[t] + 1;
pre[j] = t;
}
else if (cost[j] == cost[t] + w[j])
{
if (sum[j] > sum[t] + 1)
{
sum[j] = sum[t] + 1;
pre[j] = t;
}
}
}
}
}
}
int main()
{
cin >> n >> k >> city[1];
mp[city[1]] = 1;
w[1] = 0;
memset(g, 0x3f, sizeof g);
for (int i = 2; i <= n; i++)
{
cin >> city[i] >> w[i];
mp[city[i]] = i;
}
while (k--)
{
string a, b;
int c;
cin >> a >> b >> c;
int x = mp[a], y = mp[b];
g[x][y] = g[y][x] = min(g[x][y], c);
}
dijkstra();
int t = mp["ROM"];
cout << cnt[t] << ' ' << dist[t] << ' ' << cost[t] << ' ' << cost[t] / sum[t] << endl;
vector<int>path;
cout << city[1];
for (int i = t; i != 1; i = pre[i])
path.push_back(i);
for (int i = path.size() - 1; i >= 0; i--)
cout << "->" << city[path[i]];
cout << endl;
return 0;
}
pat 条条大路通罗马
最新推荐文章于 2024-05-23 17:21:42 发布