nyoj 游戏高手的烦恼 (二分图最小点覆盖)

还是想半天都没想明白。。 做得不多不熟,所以也联系不起来。

二分图最小点覆盖= 二分图的匹配数  详细请看某周的hihocoder

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #include<set>
16 #define INF 1e7
17 #define MAXN 100010
18 #define maxn 50
19 #define maxm 1000
20 #define Mod 1000007
21 using namespace std;
22 typedef long long LL;
23 
24 
25 int T;
26 int u, v;
27 int n, m;
28 int ans;
29 vector<int> G[555];
30 int vis[10010];
31 int match[10010];
32 
33 bool path(int u)
34 {
35     for (int i = 0; i < G[u].size(); ++i) {
36         int v = G[u][i];
37         if (true == vis[v]) continue;
38         vis[v] = true;
39         if (match[v] == -1 || path(match[v])) {
40             match[v] = u;
41             return true;
42         }
43     }
44     return false;
45 }
46 
47 void hungarian()
48 {
49     ans = 0;
50     memset(match,-1,sizeof(match));
51     for (int i = 1; i <= n; ++i) {
52         memset(vis,0,sizeof(vis));
53         if (path(i)) ans++;
54     }
55 }
56 
57 void run()
58 {
59     scanf("%d%d",&n,&m);
60     for (int i = 0; i <= n; ++i) {
61         G[i].clear();
62     }
63     for (int i = 0; i < m; ++i) {
64         scanf("%d%d",&u,&v);
65         G[u].push_back(v);
66     }
67     hungarian();
68     printf("%d\n",ans);
69     
70 }
71 int main()
72 {
73     scanf("%d", &T);
74     while (T--)
75         run();
76     return 0;
77 }

 

posted @ 2015-03-14 20:25  UsedRose  阅读(157)  评论(0编辑  收藏  举报