#include <bits/stdc++.h>
using namespace std;
#define eps 1e-4
#define push emplace
#define push_back emplace_back
const int N = 1e5, M = 2e5;
int n, m, n1, m1, d[N], rd[N], S = 290, T = 299, cnt = 1, hd[N], now[N], pos[N];
double dis[N], len[N], ans;
struct Edge {
int v, a, b;
};
vector<Edge> g[N];
struct edge {
int v, ne;
double w;
}e[M];
inline void add(int u, int v, double w) {
e[++cnt] = edge{v, hd[u], w};
hd[u] = cnt;
e[++cnt] = edge{u, hd[v], 0};
hd[v] = cnt;
}
inline bool check(int u, double x) {
for (int i = 1; i <= n; ++i) {
dis[i] = 1e9;
d[i] = rd[i];
}
queue<int> q;
dis[n] = 0;
for (int i = 1; i <= n; ++i) {
if (!d[i]) {
q.push(i);
}
}
while (q.size()) {
int k = q.front();
q.pop();
if (k == u) {
return dis[k] <= 0;
}
for (auto i : g[k]) {
dis[i.v] = min(dis[i.v], dis[k] + 1.0 * i.a - 1.0 * x * i.b);
if (!--d[i.v]) {
q.push(i.v);
}
}
}
return 0;
}
inline bool bfs() {
for (int i = 1; i <= T; ++i) {
now[i] = hd[i];
pos[i] = 0;
}
pos[S] = 1;
queue<int> q;
q.push(S);
while (q.size()) {
int x = q.front();
q.pop();
for (int i = hd[x]; i; i = e[i].ne) {
if (fabs(e[i].w) > eps && !pos[e[i].v]) {
pos[e[i].v] = pos[x] + 1;
if (e[i].v == T) {
return 1;
}
q.push(e[i].v);
}
}
}
return 0;
}
double dfs(int x, double f) {
if (x == T) {
return f;
}
double s = 0;
for (int i = now[x], p; i; i = e[i].ne) {
if (fabs(e[i].w) > eps && pos[e[i].v] == pos[x] + 1) {
p = dfs(e[i].v, min(f - s, e[i].w));
e[i].w -= p;
e[i ^ 1].w += p;
s += p;
if (fabs(f - s) <= eps) {
now[x] = fabs(e[i].w) > eps ? i : e[i].ne;
return s;
}
}
}
now[x] = pos[x] = 0;
return s;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1, u, v, a, b; i <= m; ++i) {
scanf("%d%d%d%d", &u, &v, &a, &b);
g[u].push_back(Edge{v, a, b});
++rd[v];
}
scanf("%d%d", &m1, &n1);
for (int i = 1; i <= n1; ++i) {
double l = 0, r = 10;
len[i] = 1e9;
while (l + eps <= r) {
double mid = (l + r) / 2;
if (check(i, mid)) {
len[i] = r = mid;
} else {
l = mid;
}
}
}
for (int i = 1, u, v; i <= m1; ++i) {
scanf("%d%d", &u, &v);
if (v & 1) {
swap(u, v);
}
add(u, v, 1e9);
}
for (int i = 1; i <= n1; ++i) {
if (i & 1) {
add(S, i, len[i]);
} else {
add(i, T, len[i]);
}
}
while (bfs()) {
ans += dfs(S, 1e18);
}
if (ans > 1e9) {
puts("-1");
} else {
printf("%.1lf", ans);
}
}
样例过了,为啥会TLE啊