90WA#8求调!!!
查看原帖
90WA#8求调!!!
596448
_Ayanami_Rei_楼主2024/1/18 17:01

sum[i][j][k]sum[i][j][k] 是存从 ii 到 jj 的路径上有点 kk 的数目

#include <iostream>
#include <cstring>
using namespace std;
#define int long long
int map[101][101], sum[101][101][101], n, m;

signed main () {
	memset (map, 0x3f, sizeof map);
	scanf ("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		map[i][i] = 0;
	}
	for (int i = 1; i <= m; ++i) {
		int a, b, c;
		cin >> a >> b >> c;
		map[a][b] = map[b][a] = c;
		sum[a][b][0] = sum[b][a][0] = 1;
	}
	for (int k = 1; k <= n; ++k) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				if (map[i][j] > map[i][k] + map[k][j]) {
					map[i][j] = map[i][k] +  map[k][j];
					sum[i][j][0] = sum[i][k][0] * sum[k][j][0];
					fill (sum[i][j] + 1, sum[i][j] + 1 + n, 0);
					sum[i][j][k] += sum[i][k][0] * sum[k][j][0];
					for (int u = 1;u <= n; ++u) {
						if (i == u || j == u|| k == u) continue;
						sum[i][j][u] += sum[i][k][u] + sum[k][j][u];
					}
				} else if (map[i][j] == map[i][k] + map[k][j] && i != k && j != k) {
					sum[i][j][0] += sum[i][k][0] * sum[k][j][0];
					sum[i][j][k] += sum[i][k][0] * sum[k][j][0];
					for (int u = 1;u <= n; ++u) {
						if (i == u || u == j || k == u) continue;
						sum[i][j][u] += sum[i][k][u] + sum[k][j][u];
					}
				}
			}
		}
	}
	for (int k = 1; k <= n; ++k) {
		double ans = 0.0;
		for (int i = 1; i <= n; ++i) {
			if (i == k) continue;
			for (int j = 1; j <= n; ++j) {
				if (j == k) continue;
				if (sum[i][j][0] != 0)
					ans += sum[i][j][k] * 1.0 / sum[i][j][0];
			}
		}
		printf ("%.3f\n", ans);
	}
	return 0;
}
2024/1/18 17:01
加载中...