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

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

 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死活过不去才发现是自己写错了,汗。

时间: 2024-10-31 14:52:32

hdu 1151 或 poj 1422 二分图 最小点覆盖集的相关文章

poj 2226 二分图 最小点覆盖 , 最大流

题目就是问如何用最小的板覆盖所有的草地.可以横着放,也可以竖着放,允许一个草地放多个点. 建图方法就是 每个横向的草地作为X,纵向连续的草地作为Y.     X连接Y的边表示,  这里有他们的公共点.. 很显然,覆盖所有草地,就是覆盖所有的边 ,二分图中,最小点覆盖 = 最大匹配 = =其实如果存在一条边未被选中的节点覆盖,则必然存在一条对应的增广路径 //tpl //ipqhjjybj_tpl.h //header.h #include <cstdio> #include <cstdl

POJ2226 Muddy Fields(二分图最小点覆盖集)

题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作为XY部,每一块泥地看作边.这样就构造出了一个二分图. 那么,问题就是在这个二分图中就是选出最少的点覆盖所有的边,即二分图最小点覆盖集,而二分图最小点覆盖集=二分图最大匹配. 1 #include<cstdio> 2 #include<cstring> 3 #include<qu

Asteroids POJ - 3041 二分图最小点覆盖

Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice point

Asteroids POJ - 3041 【最小点覆盖集】

Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the grid. Fortun

Strategic game POJ - 1463 【最小点覆盖集】

Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend a medieval city, the roads of which form a tree. He has to

poj 2226 Muddy Fields(二分图最小点覆盖)

B - Muddy Fields Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2226 Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <

POJ3041 Asteroids【二分图最小点覆盖】

题目链接: http://poj.org/problem?id=3041 题目大意: 有一个N*N的矩阵,有些格子上有障碍物(坐标为(x,y) ),在消除这些障碍物的时候,可以一次性消除 该障碍物同一行所有的障碍物,或是一次性消除该障碍物同一列所有的障碍物.只能选择清理该行或是 清理该列.问:最小进行多少次消除,就可以清理所有的障碍物. 思路: 可以将每一行当做一个点,这样总共有N个点,作为二分图的一边.将每一列当做一个点,这样又有N 个点,作为二分图的另一边.将有障碍物的行点和列点连接起来,每

POJ 1422 DAG最小路径覆盖

求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径 这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边即可. 故最小覆盖数还是 顶点数-最大匹配数 根据DAG建图的时候,就是DAG有边就给对应的端点建边 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int d[15

POJ1325 Machine Schedule【二分图最小点覆盖】

题目链接: http://poj.org/problem?id=1325 题目大意: 有两台机器A和B,机器A有N种不同的模式,编号为0~N-1.机器B有M种不同的模式,编号为0~M-1. 在一开始的时候,机器A和B都处于0模式.现在需要用两台机器来处理K项任务,任务编号为0~K-1.每 一项任务都可以在A或B的指定状态下完成.例如任务1可以在机器A的2模式下完成,也可以在机器B的4 模式下完成.对于第i想任务用(i,x,y)来表示第i项任务可以在机器A的x模式下或机器B的y模式下完成. 为了完