2018ic南京 I-Magic Potion(网络流、最大流)

题意:
给定 n 、 m 、 k n、m、k nmk分别表示英雄个数、怪兽个数、药水数量。每个英雄可以杀死一系列怪物中的至多一个,每个怪物最多被杀死一次。 k k k个药水可以额外给任意 k k k个英雄增加一次杀死怪物的机会。(换句话说,用了药水英雄可以多杀一个怪物)
问最多杀死怪物个数
思路:最大流,问题在于建图。强哥一眼秒,不愧是强。
一开始建图是这样的
在这里插入图片描述
但是这样可能产生问题是对于k=0的情况下,由于S1到英雄的流量限制是2,但是实际限制应该只有1。就会wa
这样的情况其实只要把n和k分开就好,建图如下
在这里插入图片描述
数据范围 M ≤ 2.5 × 1 0 5 M\le2.5\times10^5 M2.5×105,用dinic分层求个最大流
时间复杂度 O ( M N ) O(M\sqrt{N}) OMN ,可可可冲冲冲

AC代码

const int N = 2e4 + 10, M = 3e6 + 100;
int head[N], ver[M], edge[M], Next[M], d[N];
int n, m, s, t, tot, maxflow;
int k, mm, S1, S2;
queue<int>q;
void add(int x, int y, int z) {
    
    
	ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
	ver[++tot] = x, edge[tot] = 0, Next[tot] = head[y], head[y] = tot;
}
bool bfs() {
    
     // 在残量网络上构造分层图
	memset(d, 0, sizeof(d));
	while (q.size()) q.pop();
	q.push(s); d[s] = 1;
	while (q.size()) {
    
    
		int x = q.front(); q.pop();
		for (int i = head[x]; i; i = Next[i])
			if (edge[i] && !d[ver[i]]) {
    
    
				q.push(ver[i]);
				d[ver[i]] = d[x] + 1;
				if (ver[i] == t) return 1;
			}
	}
	return 0;
}
int dinic(int x, int flow) {
    
    //在当前分层图上增广
	if (x == t)return flow;
	int rest = flow, k;
	for (int i = head[x]; i&&rest; i = Next[i]) {
    
    
		if (edge[i] && d[ver[i]] == d[x] + 1) {
    
    
			k = dinic(ver[i], min(rest, edge[i]));
			if (!k)d[ver[i]] = 0;//剪枝,去掉增广完毕的点
			edge[i] -= k;
			edge[i ^ 1] += k;
			rest -= k;
		}
	}
	return flow - rest;
}           

int main()
{
    
    
	cin >> n >> m >> k;
	int tt;
	s = N - 1;
	tot = 1;
	S1 = N - 2, S2 = N - 3, t = N - 4;
	for (int i = 1; i <= n; i++) {
    
    
		cin >> mm;
		add(S1, i, 1);
		add(S2, i, 1);
		for (int j = 1; j <= mm; j++) {
    
    
			cin >> tt;
			add(i, n + tt, 1);
		}
	}
	for (int i = 1; i <= m; i++) {
    
    
		add(i + n, t, 1);
	}
	add(s, S1, n);
	add(s, S2, k);
	int flow = 0;
	while (bfs()) {
    
    
		while (flow = dinic(s, inf))maxflow += flow;
	}
	cout << maxflow << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44986601/article/details/111052095