2018icpc南京I.マジックポーション(gym101981)二部グラフ]

トピック:

给N(ヒーロー)M(モンスター)K(マジック)

Nは、各ラインのq主人公の下に与えられているこれらのモンスターの少数のモンスターと種を殺すことができます

唯一のモンスターの魔法のポーションを殺すことができる各ヒーローは魔法のボトルアップモンスターの使用を廃棄ヒーローヒーローを作ることができます

(2部グラフマッチング)と思いました。

まずハンガリー超える魔法RANを使用せずに - >英雄の数はモンスター(コードQ)を取得するために殺すことができる戻ります

再び怪物を殺す魔法を使用することができます英雄の残りの場合> - - そして、各配列からこの時間は再びハンガリーに戻っピットインヒーロー[モンスター] =から救うことができました>ヒーローごとに収まることができる唯一の魔法!2部グラフマッチング、テロリストの苦境!(参照ドウロアニメーションの大陸最近の弾幕は「」テロリストの苦境、「スクレーパーで、私はまた、ハッハッハ継承されます)

注QQ =分(kは、ヒーローを殺すために継続することができます)。

ANS = Q + Q;

 

ACコード(二部グラフ)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;
const int MaxN = 505;

int n,m,k;
vector<int> G[MaxN];
bool used[MaxN];
int Size[MaxN],from[MaxN];

bool match(int x){
	for(int i = 0;i < Size[x]; i++){
		if(!used[G[x][i]]){
			used[G[x][i]] = 1;
			if(from[G[x][i]] == -1 || match(from[G[x][i]])){
				from[G[x][i]] = x;
				return 1;
			}
		}
	}
	return 0;
}

int hungry(){
	int tot = 0;
	for(int i = 1;i <= n; i++) Size[i] = G[i].size();
	for(int i = 1;i <= n; i++){
		for(int j = 1;j <= m; j++) used[j] = 0;
		if(match(i)) ++tot;
	}
	return tot;
}

int main()
{
	scanf("%d %d %d",&n,&m,&k);
	for(int i = 1;i <= n; i++){
		int q;
		scanf("%d",&q);
		for(int j = 1;j <= q; j++){
			int cur;
			scanf("%d",&cur);
			G[i].push_back(cur);
		}
	}
	for(int i = 1;i <= m; i++) from[i] = -1;
	int Q = hungry();
	int QQ = hungry();
	printf("%d\n", Q + min(QQ, k));
}

 

公開された31元の記事 ウォンの賞賛5 ビュー1373

おすすめ

転載: blog.csdn.net/qq_43685900/article/details/102171853