bzoj1191[HNOI2006] 超级英雄Hero

题目链接:bzoj1191

题目大意:

总共有m道题,选手有n种不同的“锦囊妙计”。主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”只能用一次。选手只有答对了题才能接着答题,否则直接被淘汰。问最多通过的题数。


题解:

匈牙利求二分图最大匹配

构图:题当公牛,锦囊当母牛。每道题都连上它能用的锦囊就好了

要看题啊看清题啊。没看清题就交WA了两次qwq


//如果我在GDKOI前做了这题,我可能就不会把day2T2想成单纯的贪心了TAT出来发现个个都会构图???

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1500

int bf[maxn],n,m;
bool ask[maxn],ed[maxn][maxn];
bool ffindmn(int x)
{
	for (int i=0;i<n;i++)
	  if (ed[x][i] && !ask[i]) 
	  {
		  ask[i]=true;
		  if (bf[i]==-1 || ffindmn(bf[i]))
		  {
			  bf[i]=x;
			  return true;
		  }
	  }
	return false;
}
int main()
{
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	int i,x,y,ans;ans=0;
	scanf("%d%d",&n,&m);
	memset(ed,0,sizeof(ed));
	for (i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		ed[i][x]=ed[i][y]=true;
	}
	memset(bf,-1,sizeof(bf));
	for (i=1;i<=m;i++)
	{
		memset(ask,false,sizeof(ask));
		if (ffindmn(i)) ans++;
		else break;
	}
	printf("%d
",ans);
	return 0;
}


原文地址:https://www.cnblogs.com/Euryale-Rose/p/6527805.html