不知道哪里错了,1号测试点错误
#include<iostream>//27分,一个点错误
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 220;
int G[maxn][maxn], d[maxn], vis[maxn];
int weight[maxn], w[maxn];//点权
int num[maxn];//最短路径数
int CitySum[maxn];//最短路径上的节点数量,点权总量相同时,节点数量越多,平均点权值就越小,结合这个数组在dijkstra函数中选择出最终路径
vector<int> path[maxn];//最短路径
int n, k, s, e, t;//s为起点,e为终点
void dijkstra(int s) {
fill(vis, vis + maxn, 0);
fill(d, d + maxn, INF);
d[s] = 0;
fill(w, w + maxn, 0);
w[s] = 0;
fill(num, num + maxn, 0);
num[s] = 1;
fill(CitySum, CitySum + maxn, 0);
CitySum[s] = 1;
for (int i = 0; i < n; i++) {
int u = -1, Min = INF;
for (int j = 0; j < n; j++) {
if (vis[j] == 0 && d[j] < Min) {
u = j;
Min = d[j];
}
}
if (u == -1) { return; }
vis[u] = 1;
for (int v = 0; v < n; v++) {//将所有的条件判断集成到这里面
if (vis[v] == 0 && G[u][v] != INF) {
if (d[u] + G[u][v] < d[v]) {//更短路径
d[v] = d[u] + G[u][v];
w[v] = w[u] + weight[v];
num[v] = num[u];
path[v].clear();
path[v].push_back(u);
CitySum[v] = CitySum[u] + 1;
}
else if (d[u] + G[u][v] == d[v]) {//路径长度相同时
num[v] += num[u];不要写错地方
if (w[u] + weight[v] > w[v]) {//更高点权总量
path[v].clear();
path[v].push_back(u);
CitySum[v] = CitySum[u] + 1;
}
else if (w[u] + weight[v] == w[v] && CitySum[v] > CitySum[u] + 1) {//点权总量也相同时,更高平均点权值
CitySum[v] = CitySum[u] + 1;
path[v].clear();
path[v].push_back(u);//path数组只存储最终路径
}
}
}
}
}
}
vector<int> ans;
void Print(int e) {
ans.push_back(e);
if (e == s) { return; }
Print(path[e][0]);
}
int main() {
fill(G[0], G[0] + maxn * maxn, INF);
unordered_map<string, int> mp;//将城市名称映射到int上去
string a, b, hash[maxn];
cin >> n >> k >> a;
mp[a] = 0;
hash[0] = a;
for (int i = 1; i < n; i++) {
cin >> a >> t;
if (a == "ROM") { e = i; }
mp[a] = i;
hash[i] = a;
weight[i] = t;
}
for (int i = 1; i <= k; i++) {
cin >> a >> b >> t;
int t1 = mp[a], t2 = mp[b];
G[t1][t2] = G[t2][t1] = t;
}
dijkstra(0);
cout << num[e] << ' ' << d[e] << ' ' << w[e] << ' ' << w[e] / (CitySum[e] - 1) << endl;//除了出发点之外的平均值
Print(e);
for (int i = ans.size() - 1; i > 0; i--) {
cout << hash[ans[i]] << "->";
}
cout << hash[ans[0]];
return 0;
}