写的很好的一篇博客,可以看看哦!
http://blog.csdn.net/dark_scope/article/details/8880547
poj 2239
1 #include<iostream> 2 #include<stdio.h> 3 #include<math.h> 4 #include<string.h> 5 #include<algorithm> 6 using namespace std; 7 int n,m; 8 int map[305][305]; 9 int used[305]; 10 int girl[305]; 11 int find(int x) 12 { 13 int i,j; 14 for(i=1;i<=m;i++) 15 { 16 if(map[x][i]==1&&used[i]==0)///如果有联系,并且还未被占用 17 ///如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了) 18 { 19 used[i]=1;///占用 20 if(girl[i]==0||find(girl[i]))///如果名花无主或正能找到该妹子的归属问题 21 { 22 girl[i]=x;///将该妹子归属于x 23 return 1;///已经找到x的另一半,返回 24 } 25 } 26 } 27 return 0;///没找到 28 } 29 int main() 30 { 31 int t,clas,day; 32 while(scanf("%d",&n)!=EOF) 33 { 34 int sum=0; 35 memset(map,0,sizeof(map)); 36 memset(girl,0,sizeof(girl)); 37 m=7*12; 38 for(int i=1;i<=n;i++) 39 { 40 scanf("%d",&t); 41 while(t--) 42 { 43 scanf("%d%d",&day,&clas); 44 map[i][(day-1)*12+clas]=1;///有关联的标记为1 45 } 46 } 47 for(int i=1;i<=n;i++) 48 { 49 memset(used,0,sizeof(used));///每次使用都清零 50 if(find(i))///如果能找到,就加1 51 sum++; 52 } 53 printf("%d ",sum); 54 } 55 56 }