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 }

 

你可能感兴趣的:(二分图)