匈牙利算法

写的很好的一篇博客,可以看看哦!

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 }
View Code
原文地址:https://www.cnblogs.com/xiaotian-222/p/5452649.html