题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2239 题意简述:选课,能够选的最多的课时。 解题思路:一个裸二分匹配。 代码: #include<stdio.h> #include<string.h> using namespace std; const int Len=400; bool check[Len]; bool hide[Len][Len]; int match[Len],num,n; bool dfs(int p) { int i,t,a,b; if(p<84) a=84,b=num; else a=0,b=84; for(int i=a;i<b;i++) { if(hide[i][p]&&!check[i]) { check[i]=true; t=match[i]; match[i]=p; if(t==-1||dfs(t)) return true; match[i]=t; } } return false; } int main() { int save,a,b; while(scanf("%d",&n)!=EOF) { memset(hide,0,sizeof(hide)); num=84+n; for(int i=84;i<num;i++) { scanf("%d",&save); for(int j=0;j<save;j++) { scanf("%d%d",&a,&b); a=12*a+b-13; hide[i][a]=true; hide[a][i]=true; } } memset(match,-1,sizeof(match)); save=0; for(int i=84;i<num;i++) { memset(check,0,sizeof(check)); if(dfs(i)) save++; } printf("%d/n",save); } }