没写过dfs的spfa,写一发。
01分数规划裸题。
/* Telekinetic Forest Guard */
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef double DB;
const int maxn = 3005, maxm = 10005;
const DB inf = 1e7 + 5, eps = 1e-10;
int n, m, head[maxn], cnt;
DB dis[maxn];
struct edge {
int u, v; DB w;
} e[maxm << 1];
struct _edge {
int v; DB w; int next;
} g[maxm << 1];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
inline void add(int u, int v, DB w) {
g[cnt] = (_edge){v, w, head[u]};
head[u] = cnt++;
}
bool flag, vis[maxn];
inline void spfa(int x) {
vis[x] = 1;
for(int i = head[x]; ~i; i = g[i].next) if(dis[g[i].v] > dis[x] + g[i].w)
if(vis[g[i].v]) {
flag = 1;
break;
} else {
dis[g[i].v] = dis[x] + g[i].w;
spfa(g[i].v);
}
vis[x] = 0;
}
inline bool check(DB mid) {
for(int i = 1; i <= n; i++) head[i] = -1, dis[i] = 0, vis[i] = 0; cnt = 0;
for(int i = 1; i <= m; i++) add(e[i].u, e[i].v, e[i].w - mid);
flag = 0;
for(int i = 1; i <= n; i++) {
spfa(i);
if(flag) return 0;
}
return 1;
}
int main() {
n = iread(); m = iread();
for(int i = 1; i <= m; i++) {
int u = iread(), v = iread(); DB w; scanf("%lf", &w);
e[i] = (edge){u, v, w};
}
DB l = -inf, r = inf;
while(r - l > eps) {
DB mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%.8lf\n", l);
return 0;
}