精度问题
  • 板块灌水区
  • 楼主EasonX
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/16 21:08
  • 上次更新2024/1/17 09:45:10
查看原帖
精度问题
733488
EasonX楼主2024/1/16 21:08

代码:

#include<bits/stdc++.h>
using namespace std;
int n, m;
vector<double> to[20005], w[20005];
bool vst[20005];
double ans[105], cnt[105][105], d[105][105];
int main() {
	freopen("socialnetwork.in", "r", stdin);
	freopen("socialnetwork.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= m; ++i) {
		double a, b, c;
		cin >> a >> b >> c;
		to[int(a)].push_back(b);
		to[int(b)].push_back(a);
		w[int(a)].push_back(c);
		w[int(b)].push_back(c);
	}
	for (int i = 1; i <= m; i++)
		for (int j = 0; j < w[i].size(); j++)
			d[i][j] = w[i][j];
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
				double cost = d[i][k] + d[k][j];
				if (d[i][j] == cost)
					cnt[i][j] += cnt[i][k] * cnt[k][j];
				else if (d[i][j] > cost) {
					d[i][j] = cost;
					cnt[i][j] = cnt[i][k] * cnt[k][j];
				}
			}
	for (int v = 1; v <= n; ++v)
		for (int s = 1; s <= n; ++s)if (s != v)
			for (int t = 1; t <= n; ++t)if (t != v && t != s)
				if (d[s][t] == d[v][t] + d[s][v])
					ans[v] += cnt[s][v] * cnt[v][t] / cnt[s][t];
	for (int v = 1; v <= n; ++v)
		cout << fixed << setprecision(3) << ans[v] << endl;
	return 0;
}

输入:

5 10
5 3 5
2 5 4
1 5 3
3 4 3
4 1 5
2 3 4
2 4 5
2 1 1
1 3 2
5 4 2

输出:

0.000
-nan
-nan
-nan
-nan

正确输出:

3.667
0.000
0.667
0.667
0.667

本地和OJ都是这样

是NOI2007的题目

2024/1/16 21:08
加载中...