hdu 1054 最小点覆盖

Sample Input

4

0:(1) 1

1:(2) 2 3

2:(0)

3:(0)

5

3:(3) 1 4 2

1:(1) 0

2:(0)

0:(0)

4:(0)

Sample Output

1

2

最小点覆盖=最大匹配数

水题,懒的拍了

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 #include<vector>
 6 using namespace std;
 7 const int MAXN=1505;
 8 int linker[MAXN];
 9 bool used[MAXN];
10 vector<int>map[MAXN];
11 int uN;
12 bool dfs(int u)
13 {
14     for(int i=0;i<map[u].size();i++)
15     {
16         if(!used[map[u][i]])
17         {
18             used[map[u][i]]=true;
19             if(linker[map[u][i]]==-1||dfs(linker[map[u][i]]))
20             {
21                 linker[map[u][i]]=u;
22                 return true;
23             }
24         }
25     }
26     return false;
27 }
28 int hungary()
29 {
30     int u;
31     int res=0;
32     memset(linker,-1,sizeof(linker));
33     for(u=0;u<uN;u++)
34     {
35         memset(used,false,sizeof(used));
36         if(dfs(u)) res++;
37     }
38     return res;
39 }
40 int main()
41 {
42     int u,k,v;
43     int n;
44     while(scanf("%d",&n)!=EOF)
45     {
46         for(int i=0;i<MAXN;i++)
47            map[i].clear();
48         for(int i=0;i<n;i++)
49         {
50             scanf("%d:(%d)",&u,&k);
51             while(k--)
52             {
53                 scanf("%d",&v);
54                 map[u].push_back(v);
55                 map[v].push_back(u);
56             }
57         }
58         uN=n;
59         printf("%d\n",hungary()/2);
60     }
61     return 0;
62 }
时间: 2024-07-30 23:57:36

hdu 1054 最小点覆盖的相关文章

I - Strategic Game - hdu 1054(最小点覆盖)

题意:用最小的点来覆盖全部的边,因为二分图里面最大的匹配就是最小覆盖,所以直接匹配一下即可 *********************************************************************** #include<stdio.h>#include<string.h>#include<queue>using namespace std; const int MAXN = 1505;const int oo = 1e9+7; stru

hdu 1150 最小点覆盖

题目大意;有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi.每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次.请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少. 注意状态为0的即可 1 #include<cstdio> 2 #include<algorithm> 3 #include<

hdu 3360 最小点覆盖

题意:给你一个图,图中有宝物和保安两种元素.每个宝物需要周围的某些位置同时安放保安(如果那些位置有宝物,可以把宝物替换成保安)问你最少需要再安置多少保安,可以使所有宝物满足要求. 题意有点难懂 链接:点我 直接建无向图,少判断个奇偶性,最后除个2即可 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath>

hdu 1054 Strategic Game 二分图最小点覆盖

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每个点拆成i和i'. 从超级源点向点i连一条边,容量为1. 从i’向超级汇点连一条边,容量为1. 从i向i'连一条边,容量为正无穷. 然后求最小割/2.因为拆点拆成了2个. 也可以用二分图匹配来做,也是求出最大匹配然后/2. 1 #include <bits/stdc++.h> 2 using na

HDU 1054 Strategic Game 最小点覆盖

 最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后假如我们已经求得最小覆盖点集,那么在点集中每个点必然有着这样的性质,在于它相连的边里面,一定有一条边的端点不在最小点集中,因为如果连一条这样的边都没有,那这个点完全没有在最小点集的必要,我们任意选取这样的一条边,一定可以形成一个匹配,匹配数与最小点集中的点的个数相等,但现在这仅仅是一个匹配,他必然小于最大

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

HDU 1498 50 years, 50 colors(最小点覆盖,坑题)

50 years, 50 colors Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1635    Accepted Submission(s): 892 Problem Description On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating

HDU 3360-National Treasures(最小点覆盖+奇偶匹配)

/******************************************************* 题意: 现在有一个n*m的博物馆g,每一个g[i][j]要不是一个<=2^12 的数,要不就是-1. 如果这个点是-1,表示这个点有一个守卫 否则就是以g[i][j]为关键字规则的宝物. 具体规则是: 现在有12个被编号的点(题目中给出了图片),然后把g[i][j]表示成一个12位二进制数 ,从低位到高位(右到左)依次为1~12,如果某位i上是1,就表示在编号 为i的相对位置放置一个

HDU 3360 National Treasures 奇偶匹配最小点覆盖

题目来源:HDU 3360 National Treasures 题意:如果a[i][j] != -1 把他转成二进制 最多有12位 代表题目那张图的12个位置 如果对应位是1 说明在那里放一个守卫可以看住a[i][j]位置上的这个东西 思路:明显死最小点覆盖 奇偶匹配建图 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 55; in