90pts求调
查看原帖
90pts求调
1216364
multiple_set楼主2024/4/29 00:33

特别好题目,使我脑子旋转。

为什么第8个点T了qwq

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 3010, M = 10010;
const double eps = 1e-10;
struct edge { int u, v; double w; }e[M];
int n, m, cnt[N], vis[N]; double d[N];
vector<pair<int, int> > g[N];
bool spfa(int s, double mid)
{
	fill(d + 1, d + n + 1, 1e18);
	memset(vis, 0, sizeof(vis)), memset(cnt, 0, sizeof(cnt));
	queue<int> q; d[s] = 0, vis[s] = cnt[s] = 1; q.push(s);
	while (!q.empty())
	{
		int u = q.front(); q.pop();
		vis[u] = 0;
		for (auto x : g[u])
		{
			int v = x.first; double w = x.second;
			if (d[v] > d[u] + (w - mid))
			{
				d[v] = d[u] + (w - mid);
				if (!vis[v])
				{
					if (++cnt[v] >= n) return true;
					vis[v] = 1, q.push(v);
				}
			}
		}
	} return false;
}

int main()
{
	scanf("%d%d", &n, &m); double w;
	for (int i = 1, u, v; i <= m; i++) scanf("%d%d%lf", &u, &v, &w), g[u].push_back({v, w});
	double l = -1e7, r = 1e7;
	while (r - l > eps)
	{
		double mid = (l + r) / 2;
		if (spfa(1, mid)) r = mid;
		else l = mid;
	} printf("%.8f\n", l);
	return 0;
}
2024/4/29 00:33
加载中...