二分图的最大匹配。课程和时间可以看做二分图。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXN=505; int nx,ny; int g[MAXN][MAXN]; int cx[MAXN],cy[MAXN]; int mk[MAXN]; int n; int ZH[10000]; int path(int u) { for(int v=0; v<ny; v++) { if(g[u][v]&&!mk[v]) { mk[v]=1; if(cy[v]==-1||path(cy[v])) { cx[u]=v; cy[v]=u; return 1; } } } return 0; } int MaxMatch() { int res=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); for(int i=0; i<nx; i++) { if(cx[i]==-1) { memset(mk,0,sizeof(mk)); res=res+path(i); } } return res; } int main() { int i,t,p,q; while(~scanf("%d",&nx)) { memset(g,0,sizeof(g)); for(i=0;i<10000;i++) ZH[i]=-1; ny=0; for(i=0;i<nx;i++) { scanf("%d",&t); while(t--) { scanf("%d%d",&p,&q); if(ZH[p*100+q]==-1) { ZH[p*100+q]=ny; ny++; } g[i][ZH[p*100+q]]=1; } } printf("%d ",MaxMatch()); } return 0; }