HDU 1068

【原题】

http://acm.hdu.edu.cn/showproblem.php?pid=1068

【类型】

二分图最大独立集(最大二分匹配)

【题意】

题目给定一些男女生之间相互的romantic关系,要求找出一个最大的集合,使得该集合中的所有男女生之间都不存在romantic关系。

【分析】

一个二分图的最大独立集点数与最大二分匹配个数有直接的关系:

最大独立集点数 = 顶点数 - 最大二分匹配对数

故本题直接转化为求最大二分匹配即可,需要注意的是,题中给出的条件是1指向2,2也会指向1,所以最终算出来的匹配数其实是实际对数的两倍,最终被顶点数减去之前首先需要折半。

基础二分匹配练手题。

 1 /*
 2 ID:   Chen Fan
 3 PROG: hdu1068
 4 LANG: G++
 5 */
 6
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<cstring>
10 #include<algorithm>
11
12 using namespace std;
13
14 typedef struct nod
15 {
16
17     int a,b;
18 } node;
19 node a[1000];
20 int result[1000],start[1000],num[1000];
21 bool flag[1000];
22
23 bool op(node a,node b)
24 {
25     if (a.a==b.a) return a.b<b.b;
26     else return a.a<b.a;
27 }
28
29 bool find(int s)
30 {
31     for (int i=0;i<num[s];i++)
32     {
33         int now=a[start[s]+i].b;
34         if (!flag[now])
35         {
36             flag[now]=true;
37             if (result[now]==-1||find(result[now]))
38             {
39                 result[now]=s;
40                 return true;
41             }
42         }
43     }
44     return false;
45 }
46
47 int main()
48 {
49     int n;
50     while (scanf("%d",&n)!=EOF)
51     {
52         int tail=0;
53         for (int i=1;i<=n;i++)
54         {
55             int x,p;
56             scanf("%d: (%d",&x,&p);
57             getchar();
58             for (int j=1;j<=p;j++)
59             {
60                 int y;
61                 scanf("%d",&y);
62                 tail++;
63                 a[tail].a=x;
64                 a[tail].b=y;
65             }
66         }
67         sort(&a[1],&a[tail+1],op);
68         int o=-1;
69         memset(num,0,sizeof(num));
70         for (int i=1;i<=tail;i++)
71         {
72             if (o!=a[i].a)
73             {
74                 o=a[i].a;
75                 start[o]=i;
76             }
77             num[o]++;
78         }
79
80         memset(result,-1,sizeof(result));
81         int ans=0;
82         for (int i=0;i<n;i++)
83         {
84             memset(flag,0,sizeof(flag));
85             if (find(i)) ans++;
86         }
87
88         printf("%d\n",n-ans/2);
89     }
90
91     return 0;
92 }

时间: 2024-10-01 02:51:21

HDU 1068的相关文章

HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)

HDU 1068 :题目链接 题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识. 转换一下:就是大家都不认识的人,即最大独立集合 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <math.h> #define init(a) memset(a,

hdu 1068 Girls and Boys(匈牙利算法求最大独立集)

Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7044    Accepted Submission(s): 3178 Problem Description the second year of the university somebody started a study on the roman

hdu 1068 最大独立集合

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 题意:题意:n个同学,一些男女同学会有缘分成为情侣,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合中不存在有缘成为情侣的同学的最大同学数. 题解: 独立集:图的顶点集的子

hdu - 1068 Girls and Boys (二分图最大独立集+拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=1068 因为没有指定性别,所以要拆点,把i拆分i和i’ 那么U=V-M (M是最大匹配,U最大独立集,V是顶点数) 2U=2V-2M  所以 U=n-M'/2. (没怎么看明白)  但是不这样会wa. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #inc

[HDU] 1068 Girls and Boys(二分图最大匹配)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1068 本题求二分图最大独立点集.因为最大独立点集=顶点数-最大匹配数.所以转化为求最大匹配.因为没有给出男女,所以每个人都用了两遍,所以结果应该除以2. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h&g

HDU 1068 Girls and Boys (二分图最大独立集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合中不存在有缘成为情侣的同学的最大同学数. 独立集(图的顶点集的子集,其中任意两点不相邻) 二分图中 最大独立集 = 顶点个数 - 最大匹配数 因为男女不知道,将一个人拆成两个性别,求最大匹配后,除以2就行了. 这种做法比较难理解. 1 #include <iostream> 2 #include

hdu 1068 Girls and Boys 二分图的最大匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int n; int used[505]; int link[505][505]; int boy[505]; int find(int x){ int i; for(i=0;i<n;i++){ if(!

hdu 1068 Girls and Boys 最大独立点集 二分匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 思路: 求一集合满足,两两之间没有恋爱关系 思路: 最大独立点集=顶点数-最大匹配数 这里给出的关系,看似有向边,实则是无向边,那么按照二分匹配处理的话,相当于一个人看作两个人来用,最后还是顶点数目-最大二分匹配数 因为之间一个人当作两个人用,二分匹配数目减半,即 = n - match()/2 或者也可以写成 = ( 2n -  match() )/2 更容易理解 题目中n的大小没有说明,最

hdu 1068 Girls and Boys

英语不太好,但是题意大概是给定一个序列,每个序列给出有可能成为情侣的人,现在要你求出一个所有人都不可能成为情侣的最大集合. 解题思路就是最大独立集 , 最大独立集 = 顶点数 - 最大匹配数 ; 由于这题是拆分自己,或者说把一个点分成2个部分,所以最后的最大匹配数要除以2; 一定要记得初始化,忘了Map数组的初始化= =,超时好多次; 给出一个讲解的网址 : http://dsqiu.iteye.com/blog/1689505 1 #include <iostream> 2 #include