求捞。。。样例输出负数。。。
查看原帖
求捞。。。样例输出负数。。。
544756
xiaobing楼主2024/12/26 16:05
//#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define ull unsigned long long
#define ui unsigned int
#define veci vector<int>
#define vecb vector<bool>
#define vecl vector<long long>
#define vecn vector<node>
#define vece vector<edge>
#define quei queue<int>
#define quen queue<node>
const int N = 3e5 + 10, inf = 0x5FFFFFFF;
const ll INF = 0x7FFFFFFFFFFFFFFF;
struct edge {
	int x;
	ll w;
	int nxt;
};
int n, m;
edge e[N];
int head[N];
int ett = 1;
void addedge(int u, int v, ll w) {
	ett++;
	e[ett].nxt = head[u];
	e[ett].w = w;
	e[ett].x = v;
	head[u] = ett;
}
void insert(int u, int v, ll w) {
	addedge(u, v, w);
	addedge(v, u, 0);
}
int tmp[N], depth[N];
bool build(int s, int t) {
	for (int i = 1; i <= n + m + 4; i++)
		depth[i] = inf, tmp[i] = head[i];
	quei q;
	q.push(s);
	depth[s] = 0;
	while (!q.empty()) {
		int u = q.front(); q.pop();
		for (int i = head[u]; i; i = e[i].nxt) {
			int v = e[i].x;
			if (e[i].w && depth[v] == inf) {
				depth[v] = depth[u] + 1;
				q.push(v);
				if (v == t)return 1;
			}
		}
	}
	return 0;
}
ll extend(int u, ll flow, int t) {
	if (u == t)
		return flow;
	ll res = 0;
	for (int i = tmp[u]; i; i = e[i].nxt) {
		tmp[u] = i;
		int v = e[i].x;
		if (depth[v] == depth[u] + 1 && e[i].w) {
			ll maxflow = extend(v, min(e[i].w, flow), t);
			if (!maxflow)depth[v] = inf;
			e[i].w -= maxflow;
			e[i ^ 1].w += maxflow;
			res += maxflow;
			flow -= maxflow;
		}
	}
	return res;
}
ll dinic(int s, int t) {
	ll res = 0;
	while (build(s, t))
		res += extend(s, INF, t);
	return res;
}
ll in[N], out[N];
void solve() {
	ett = 1;
	for (int i = 1; i <= n + m + 4; i++) {
		head[i] = 0; in[i] = 0; out[i] = 0;
	}
	int s1 = n + m + 1;
	int t1 = n + m + 2;
	int s2 = n + m + 3;
	int t2 = n + m + 4;
	for (int i = 1; i <= m; i++) {
		int g; cin >> g;
		out[n + i] += g;
		in[t1] += g;
		insert(n + i, t1, g);
	}
	for (int i = 1; i <= n; i++) {
		int c, d;
		cin >> c >> d;
		insert(s1, i, d);
		for (int j = 1; j <= c; j++) {
			int t, l, r;
			cin >> t >> l >> r;
			t++;
			out[i] += l;
			in[n + t] += l;
			insert(i, n + t, r - l);
		}
	}
	ll cnt = 0;
	for (int i = 1; i <= n + m + 2; i++) {
		if (in[i] > out[i]) {
			insert(s2, i, in[i] - out[i]);
			cnt += in[i] - out[i];
		}
		else insert(i, t2, out[i] - in[i]);
	}
	insert(s1, t1, inf);
	ll ans = dinic(s2, t2);
	if (ans != cnt) {
		cout << -1;
		return;
	}
	head[s1] = e[head[s1]].nxt;
	head[t1] = e[head[t1]].nxt;
	ans += dinic(s1, t1);
	cout << ans;
	return;
}
signed main() {
	//freopen("train.in", "r", stdin);
	//freopen("train.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	while (cin >> n >> m) {
		solve();
		cout << '\n\n';
	}
	return 0;
}
2024/12/26 16:05
加载中...