网络流RE(#1-10)求助
查看原帖
网络流RE(#1-10)求助
416242
New_hope楼主2024/1/6 16:16
#include<bits/stdc++.h>
#define inf (int)(1 << 30)
#define _ (int)(2e5 + 4)
using namespace std;

int k,n,s,t,m,mxf;
int hd[_], d[_];
int o = 1;
struct ed{
	int v,w,ne;
} e[_];
vector<int> g[_];

void add(int u,int v,int w) {
	e[++o] = {v,w,hd[u]};
	hd[u] = o;
}
int dfs(int u,int mnf) {
	if(u == t) return mnf;
	int sum = 0;
	for(int i = hd[u]; i; i = e[i].ne) {
		int v = e[i].v, w = e[i].w;
		if(d[v] == d[u] + 1 && w) {
			int f = dfs(v, min(mnf,w));
			e[i].w -= f, e[i ^ 1].w += f;
			mnf -= f, sum += f;
			if(mnf == 0) break;
		}
	}
	return sum;
}
bool bfs() {
	queue<int> q; memset(d, 0, sizeof(d));
	q.push(s), d[s] = 1;
	while(!q.empty()) {
		int fr = q.front(); q.pop();
		for(int i = hd[fr]; i; i = e[i].ne) {
			int v = e[i].v, w = e[i].w;
			if(!d[v] && w) {
				d[v] = d[fr] + 1;
				if(v == t) return 1;
				q.push(v);
			}
		}
	}
	return 0;
}
int main() {
	
	cin >> k >> n;
	s = 0, t = k+n+1;
	for(int i = 1; i <= k; i ++) {
		int nd; cin >> nd;
		add(n+i,t,nd), add(t,n+i,0);
		m += nd;
	}
	for(int i = 1; i <= n; i ++) add(s,i,1), add(i,s,0);
	for(int i = 1; i <= n; i ++) {
		int p; cin >> p;
		while(p --) {
			int in; cin >> in;
			add(i,n+in,1), add(n+in,i,0);
		}
	}
	while(bfs()) {
		mxf += dfs(s,inf);
	}
	if(mxf != m) {
		cout << "No Solution!";
		return 0;
	}
	for(int i = 1; i <= n; i ++) {
		for(int j = hd[i]; j; j = e[j].ne) {
			if(!e[j].w && e[j^1].w) {
				g[e[j].v - n].push_back(i);
			}
		}
	}
	for(int i = 1; i <= k; i ++) {
		cout << i << ":";
		for(int j : g[i]) {
			cout << j << " ";
		}
		cout << endl;
	}
	
	return 0;
}
2024/1/6 16:16
加载中...