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\n",ans); return 0; }