hdu-1179 Ollivanders: Makers of Fine Wands since 382 BC.---二分图匹配模板

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1179

题目大意:

有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人)。接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号。最后问老板最多能卖出多少根魔杖。这个赤裸裸的模版题,套下就OK了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1000 + 10;
 5 const int INF = 1e9;
 6 bool Map[maxn][maxn];
 7 int cx[maxn], cy[maxn];
 8 int cntx, cnty;
 9 bool vis[maxn];
10 bool dfs(int u)
11 {
12     for(int v = 1; v <= cnty; v++)
13     {
14         if(Map[u][v] && !vis[v])
15         {
16             vis[v] = 1;
17             if(cy[v] == -1 || dfs(cy[v]))
18             {
19                 cx[u] = v;
20                 cy[v] = u;
21                 return 1;
22             }
23         }
24     }
25     return 0;
26 }
27 int maxmatch()
28 {
29     int ans = 0;
30     memset(cx, -1, sizeof(cx));
31     memset(cy, -1, sizeof(cy));
32     for(int i = 1; i <= cntx; i++)
33     {
34         if(cx[i] == -1)
35         {
36             memset(vis, 0, sizeof(vis));
37             ans += dfs(i);
38         }
39     }
40     return ans;
41 }
42 int main()
43 {
44     int n, i, u, v;
45     while(cin >> cnty && cnty)
46     {
47         cin >> cntx;
48         memset(Map, 0, sizeof(Map));
49         for(int u = 1; u <= cntx; u++)
50         {
51             cin >> i;
52             while(i--)
53             {
54                 cin >> v;
55                 Map[u][v] = 1;
56             }
57         }
58         cout<<maxmatch()<<endl;
59     }
60     return 0;
61 }

 

posted @ 2018-04-22 22:23  _努力努力再努力x  阅读(224)  评论(0编辑  收藏  举报