萌新刚学网络流 ISAP拆点60pts求助
  • 板块P1402 酒店之王
  • 楼主strcmp
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/2/23 11:12
  • 上次更新2023/10/28 07:54:57
查看原帖
萌新刚学网络流 ISAP拆点60pts求助
551861
strcmp楼主2022/2/23 11:12

悲惨的提交记录

60pts

#include <bits/stdc++.h>
using namespace std;
#define inf 1000000000000000
#define V 50010
#define E 1000010
typedef long long int ll;
struct edge {
public:
	int to, next;
	ll capa;
};
int cnt = 0, head[V]; int n, m; vector<edge>node(E);
inline void add(int fir, int nxt, ll w) {
	node[cnt].to = nxt;
	node[cnt].capa = w;
	node[cnt].next = head[fir];
	head[fir] = cnt; ++cnt;
}
int s, t, deep[V], gap[V], cur[V]; queue<int>que; ll sum = 0;
inline void initing() {
	memset(deep, -1, V * sizeof(int));
	memcpy(cur, head, V * sizeof(int));
}
inline void bfs() {
	int fro, ito;
	que.push(t); deep[t] = 0; ++gap[deep[t]];
	while (!que.empty()) {
		fro = que.front(); que.pop();
		for (register int i = head[fro]; i != -1; i = node[i].next) {
			ito = node[i].to;
			if (deep[ito] == -1) {
				deep[ito] = deep[fro] + 1;
				que.push(ito);
				++gap[deep[ito]];
			}
		}
	}
}
ll dfs(int u, ll flow) {
	if (u == t || flow == 0)return flow; ll used = 0, wei = 0;
	for (int i = cur[u]; i != -1; i = node[i].next) {
		cur[u] = i;
		if (deep[u] == deep[node[i].to] + 1 && node[i].capa > 0) {
			wei = dfs(node[i].to, min(flow - used, node[i].capa));
			if (wei) {
				node[i].capa -= wei;
				node[i ^ 1].capa += wei;
				used += wei;
			}
		}
		if (used == flow)return used;
	}
	if (used < flow) {
		--gap[deep[u]];
		if (!gap[deep[u]])deep[s] = t + 1;
		++gap[++deep[u]];
	}
	return used;
}
ll ISAP() {
	initing(); bfs();
	while (deep[s] < t) {
		sum += dfs(s, inf);
		memcpy(cur, head, V * sizeof(int));
	}
	return sum;
}
int main() {
	ios::sync_with_stdio(0);
	memset(head, -1, V * sizeof(int));
	int p, q; cin >> n >> p >> q; bool ls;
	s = 1; t = n * 2 + p + q + 2;
	int llen = p + 1, kr = n + llen, kr2 = kr+n, cai = kr2 + q;
	for (int i = 2; i <= llen; i++) {
		add(s, i, 1); 
		add(i, s, 0);
	}
	for (int i = 2; i <= llen; i++) {
		for (int j = llen + 1; j <= kr; j++) {
			cin >> ls;
			if (ls == true) {
				add(i, j, 1);
				add(j, i, 0);
			}
		}
	}
	for (int i = llen+1; i <= kr; i++) {
		add(i, i + n, 1);
		add(i + n, i, 0);
	}
	for (int i = kr + 1; i <= kr2; i++) {
		for (int j = kr2 + 1; j <= cai; j++) {
			cin >> ls;
			if (ls == true) {
				add(i, j, 1);
				add(j, i, 0);
			}
		}
	}
	for (int i = kr2 + 1; i <= cai; i++) {
		add(i, t, 1);
		add(t, i, 0);
	}
	ISAP();
	cout << sum;
	return 0;
}

目前已知是ISAP的祸,拆点是对的。

Hack数据:

3 2 2
1 0
1 0
0 1
1 0
0 1
1 0

Hack数据图: 画红边的增广路没被增广到

救救孩子吧,实在调不出来了Orz。

2022/2/23 11:12
加载中...