spfa初值问题
查看原帖
spfa初值问题
173077
William_Wang_楼主2023/1/11 21:01
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3005;
const double eps = 1e-9;
struct Edge{
	int to; double w;
};
vector <Edge> G[MAXN];
queue <int> q;
int n, m, inque[MAXN];
double dis[MAXN];
bool spfa(int u,double x)
{
	inque[u] = 1;
	for(auto edge:G[u])
	{
		int v = edge.to; double w = edge.w - x;
		if(dis[v] > dis[u] + w)
		{
			dis[v] = dis[u] + w;
			if(inque[v] or spfa(v,x)) return true;
		}
	}
	inque[u] = 0;
	return false;
}
bool check(double x)
{
	for(int i=1;i<=n;i++) dis[i] = 0, inque[i] = 0;
	for(int i=1;i<=n;i++)
		if(spfa(i,x)) return true;
	return false;
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		int u, v; double w;
		cin >> u >> v >> w;
		G[u].push_back((Edge){v,w});
	}
	double l=-1e9, r=1e9;
	while(l+eps<r)
	{
		double mid = (l+r)/2;
		if(check(mid)) r=mid-eps;
		else l=mid+eps;
	}
	printf("%.8lf",l);
	return 0;
}

为什么这里的 dis 初值要设为 0 , 不应该设为 ++\infty 吗,但这样会TLE

2023/1/11 21:01
加载中...