码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1151 或 poj 1422 二分图 最小点覆盖集

时间:2015-04-18 01:00:46      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

最小点覆盖集的裸题,只要“拆点建边”然后求出最大匹配,则:最小点覆盖集的大小 = 点数 - 最大匹配

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 121;
 7 const int M = 5000;
 8 bool visit[N];
 9 int mark[N];
10 int head[N];
11 int n, m, e;
12 
13 void init()
14 {
15     e = 0;
16     memset( head, -1, sizeof(head) );
17 }
18 
19 struct Edge
20 {
21     int v, next;
22 } edge[M];
23 
24 void addEdge( int u, int v )
25 {
26     edge[e].v = v;
27     edge[e].next = head[u];
28     head[u] = e++;
29 }
30 
31 int dfs( int u )
32 {
33     for ( int i = head[u]; i != -1; i = edge[i].next )
34     {
35         int v = edge[i].v;
36         if ( !visit[v] )
37         {
38             visit[v] = 1;
39             if ( mark[v] == -1 || dfs(mark[v]) )
40             {
41                 mark[v] = u;
42                 return 1;
43             }
44         }
45     }
46     return 0;
47 }
48 
49 int solve()
50 {
51     int ans = n;
52     memset( mark, -1, sizeof(mark) );
53     for ( int i = 1; i <= n; i++ )
54     {
55         memset( visit, 0, sizeof(visit) );
56         ans -= dfs(i);
57     }
58     return ans;
59 }
60 
61 int main ()
62 {
63     int t;
64     scanf("%d", &t);
65     while ( t-- )
66     {
67         scanf("%d%d", &n, &m);
68         init();
69         while ( m-- )
70         {
71             int a, b;
72             scanf("%d%d", &a, &b);
73             addEdge( a, b );
74         }
75         printf("%d\n", solve());
76     }
77     return 0;
78 }

hdu的数据也太弱了,一开始手误将dfs中的mark[v]写成了v居然都过了,后来交到poj死活过不去才发现是自己写错了,汗。

hdu 1151 或 poj 1422 二分图 最小点覆盖集

标签:

原文地址:http://www.cnblogs.com/huoxiayu/p/4436414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!