最后一个无解数据MLE求调
查看原帖
最后一个无解数据MLE求调
758820
Porridge_Dust楼主2024/3/9 09:45
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 2e3 + 100, M = N * 40, inf = 1e9;

int k, n, m, S, T;
int h[N], ne[M], ver[M], f[M], tot = 1;
int q[N], d[N], cur[N];

void add (int u, int v, int w) {
	ver[ ++ tot] = v, f[tot] = w, ne[tot] = h[u], h[u] = tot;
}

bool bfs () {
	memset (d, 0, sizeof d);
	int hh = 0, tt = 0;
	q[0] = S, d[S] = 1, cur[S] = h[S];
	while (hh <= tt) {
		int u = q[hh ++ ];
		for (int i = h[u]; i; i = ne[i]) {
			int v = ver[i];
			if (!d[v] && f[i]) {
				d[v] = d[u] + 1;
				cur[v] = h[v];
				if (v == T) return 1;
				q[ ++ tt] = v;
			}
		}
	}
	return 0;
}

int find (int u, int limit) {
	if (u == T) return limit;
	int flow = 0;
	for (int i = cur[u]; i && flow < limit; i = ne[i]) {
		int v = ver[i];
		cur[u] = i;
		if (d[v] = d[u] + 1 && f[i]) {
			int t = find(v, min(limit - flow, f[i]));
			if (!t) d[v] = 0;
			flow += t, f[i] -= t, f[i ^ 1] += t;
		}
	}
	return flow;
}

int dinic () {
	int res = 0, flow;
	while (bfs()) while (flow = find(S, inf)) res += flow;
	return res;
}

int main () {
	cin >> k >> n;
	S = n + k + 1, T = n + k + 2;
	for (int i = 1, w; i <= k; i ++ ) cin >> w, m += w, add(n + i, T, w), add(T, n + i, 0);
	for (int i = 1, p; i <= n; i ++ ) {
		cin >> p;
		add (S, i, 1), add(i, S, 0);
		for (int j = 1, l; j <= p; j ++ ) cin >> l, add(i, n + l, 1), add(n + l, i, 0); 
	}
	if (dinic() != m) cout << "No Solution!" << '\n';
	else {
		for (int i = 1; i <= k; i ++ ) {
			cout << i << ':';
			for (int j = h[n + i]; j; j = ne[j]) 
				if (f[j] && ver[j] != T) cout << ver[j] << " ";
			cout << '\n';
		}
	}
	return 0;
}

半天没想明白到底怎么MLE的

2024/3/9 09:45
加载中...