多源汇最短路(APSP问题)
使用邻接矩阵存图,可以处理负权边,以 \(\mathcal{O}(N^3)\) 的复杂度计算。注意,这里建立的是单向边,计算双向边需要额外加边。
const int N = 210;
int n, m, d[N][N];void floyd() {for (int k = 1; k <= n; k ++)for (int i = 1; i <= n; i ++)for (int j = 1; j <= n; j ++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
int main() {cin >> n >> m;for (int i = 1; i <= n; i ++)for (int j = 1; j <= n; j ++)if (i == j) d[i][j] = 0;else d[i][j] = INF;while (m --) {int x, y, w; cin >> x >> y >> w;d[x][y] = min(d[x][y], w);}floyd();for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= n; ++ j) {if (d[i][j] > INF / 2) cout << "N" << endl;else cout << d[i][j] << endl;}}
}