蒟蒻狂T不止求助
查看原帖
蒟蒻狂T不止求助
539211
lzyqwq楼主2022/10/12 21:39
#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啊

2022/10/12 21:39
加载中...