每个合法点对(i,j)最多只会贡献一个重要的城市
那么我们跑一遍floyd
在floyd的时候求出每个点对最后一个用来松弛的中间点
如果存在多个中间点 说明这个点对不会贡献重要的城市
最后答案还要离散化一下 因为不同点对贡献的重要的城市可能相同
#include<bits/stdc++.h>
using namespace std;
const int maxn = 207;
int f[maxn][maxn], ans[maxn][maxn];
int stk[20007], tot, top, n, m;
int main() {
cin >> n >> m;
memset(f, 0x3f, sizeof(f));
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
f[u][v] = f[v][u] = w;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
if (f[i][j] > f[i][k] + f[k][j]) {
f[i][j] = f[i][k] + f[k][j];
if (k != i && k != j && i != j)
ans[i][j] = k;
} else if (f[i][j] == f[i][k] + f[k][j] && k != i && i != j && k != j) {
ans[i][j] = 0;
}
}
for (int i = 1; i < n; i++)
for (int j = i+1; j <= n; j++)
if (ans[i][j])
stk[++top] = ans[i][j];
sort(stk + 1, stk + top + 1);
for (int i = 1; i <= top; i++) {
if (i == 1 || stk[i] != stk[i-1]) stk[++tot] = stk[i];
}
if (tot) {
for (int i = 1; i <= tot; i++) printf("%d ", stk[i]);
} else puts("No important cities.");
}