poj2239 Selecting Courses(最大二分图匹配 (匈牙利算法) 实现 )
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#define MAXSIZE 205#define sf scanf#define pf printf#define __int64 long long#define INF 0xfffffff#include<queue>using namespace std;int map[MAXSIZE][MAXSIZE];int vis[MAXSIZE],link[MAXSIZE];int n1,n2=84;bool MaxMatch(int x){ for(int i=0;i<n2;i++) { if(map[x][i]&&!vis[i]) { vis[i]=1; if(link[i]==-1||MaxMatch(link[i])) { link[i]=x; return true; } } } return false;}int main(){ while(~sf("%d",&n1)) { memset(link,-1,sizeof(link)); memset(map,0,sizeof(map)); int t; for(int i=0;i<n1;i++) { sf("%d",&t); int u,v; for(int j=0;j<t;j++) { sf("%d%d",&u,&v); map[i][(u-1)*12+v-1]=1; } } int sum=0; for(int i=0;i<n1;i++) { memset(vis,0,sizeof(vis)); if(MaxMatch(i)) sum++; } cout<<sum<<endl; }}