POJ 2239 Selecting Courses[二分图匹配]
题意: 给你一些课程和他们的上课时间,求在不冲突的情况下最多能上几节课。
分析: 裸的二分图。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) struct node { int to,next; }q[10000000]; int tot; int head[303]; void add(int s,int u) { q[tot].to=u; q[tot].next=head[s]; head[s]=tot++; } int link[303]; int v[100]; int find(int x) { int i,k; for(i=head[x];i;i=q[i].next) { k=q[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } int main() { int tot,n,t,i,j,a,b; while(scanf("%d",&n)!=EOF) { clr(head); tot=1; for(i=1;i<=n;i++) { scanf("%d",&t); while(t--) { scanf("%d%d",&a,&b); add(i,12*a+b); } } clr(link); tot=0; for(j=1;j<=n;j++) { clr(v); if(find(j)) tot++; } printf("%d\n",tot); } return 0; }