题目链接: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\n",ans);
return 0;
}