#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 , 不应该设为 +∞ 吗,但这样会TLE