rt,对于 -1 没有判对,鉴定为没有 -1 的点,代码如下。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const double eps = 1e-5;
int head[N], ne[N], to[N], id, ty[N];
double w[N];
void add(int x, int y, double z, int tye)
{
to[++id] = y, ne[id] = head[x], w[id] = z, ty[id] = tye, head[x] = id;
}
int n, s, t;
double dis[N];
int cnt[N];
bool vis[N];
bool SPFA(double now)
{
for(int i = 0; i <= n; i++) dis[i] = -1e9, cnt[i] = 0, vis[i] = 0;
queue<int> p;
vis[n + 1] = 1;
dis[n + 1] = 0;
p.push(n + 1);
while(!p.empty())
{
int u = p.front();
p.pop();
vis[u] = 0;
for(int i = head[u]; i ; i = ne[i])
{
int v = to[i];
double ws;
if(ty[i] == 1) ws = log2(w[i] - now);
if(ty[i] == 2) ws = -log2(w[i] + now);
if(ty[i] == 3) ws = w[i];
if(dis[v] < dis[u] + ws)
{
dis[v] = dis[u] + ws;
cnt[v] = cnt[u] + 1;
if(cnt[v] > n + 1) return 1;
if(!vis[v]) vis[v] = 1, p.push(v);
}
}
}
return 0;
}
double l = 0, r = 10;
signed main()
{
cin >> n >> s >> t;
for(int i = 1; i <= s; i++)
{
int opt, x, y, k;
cin >> opt >> x >> y >> k;
add(y, x, k, opt);
if(opt == 1) r = fmin(r, k);
}
for(int i = 1; i <= t; i++)
{
int c, k;
cin >> c >> k;
add(0, c, log2(k), 3);
add(c, 0, -log2(k), 3);
}
for(int i = 0; i <= n; i++) add(n + 1, i, 0, 3);
if(!SPFA(0)) return printf("-1"), 0;
double ans = l;
while(r - l > eps)
{
double mid = (l + r) / 2.0;
if(SPFA(mid)) ans = mid, l = mid + eps;
else r = mid - eps;
}
printf("%.5lf\n", ans);
return 0;
}