POJ 1469 ZOJ 1140 Courses 二分图匹配

继续匈牙利二分匹配,其实我都不知道怎样写匈牙利算法,只是记住了可以这样写,悲哀啊

唉````

裸的二分匹配,贴代码:

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #define MAXC 105
 4 #define MAXS 305
 5 bool g[MAXC][MAXS];
 6 bool used[MAXS];
 7 int p,n;
 8 int xx[MAXC],yy[MAXS];
 9 void init()
10 {
11     int i,j;
12     scanf("%d%d",&p,&n);
13     memset(g,0,sizeof(g));
14     for(i=0; i<p; ++i)
15     {
16         int num,st;
17         scanf("%d",&num);
18         for(j=0; j<num; ++j)
19         {
20             scanf("%d",&st);
21             g[i][st]= 1;
22         }
23     }
24 }
25 bool path(int u)
26 {
27     int v;
28     for(v=1; v<=n; ++v)
29     {
30         if(g[u][v] && !used[v])
31         {
32             used[v] = 1;
33             if(yy[v] == -1 || path(yy[v]))
34             {
35                 xx[u] = v;
36                 yy[v] = u;
37                 return 1;
38             }
39         }
40     }
41     return 0;
42 }
43 void maxMatch()
44 {
45     int i;
46     memset(xx,0xff,sizeof(xx));
47     memset(yy,0xff,sizeof(yy));
48     int ans = 0;
49     for(i=0; i<p; ++i)
50     {
51         if(xx[i] == -1)
52         {
53             memset(used,0,sizeof(used));
54             if(path(i))
55                 ++ans;
56         }
57     }
58     if(ans == p) printf("YES\n");
59     else        printf("NO\n");
60 }
61 int main()
62 {
63 //    freopen("in.cpp","r",stdin);
64     int T;
65     scanf("%d",&T);
66     while(T--)
67     {
68         init();
69         maxMatch();
70     }
71     return 0;
72 }

 

posted on 2013-04-09 22:39  allh123  阅读(214)  评论(0编辑  收藏  举报

导航