`

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): 3260    Accepted Submission(s): 1405

Problem Description
the second year of the university somebody started a study on the romantic relations between the students. The relation “romantically involved” is defined between one girl and one boy. For the study reasons it is necessary to find out the maximum set satisfying the condition: there are no two students in the set who have been “romantically involved”. The result of the program is the number of students in such a set.

The input contains several data sets in text format. Each data set represents one set of subjects of the study, with the following description:

the number of students
the description of each student, in the following format
student_identifier:(number_of_romantic_relations) student_identifier1 student_identifier2 student_identifier3 ...
or
student_identifier:(0)

The student_identifier is an integer number between 0 and n-1, for n subjects.
For each given data set, the program should write to standard output a line containing the result.
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0

 

Sample Output
5 2
            题目大意:给你每个人互相认识的人,然后问最多能找到多少个人都互不认识。其实就是找:最大独立集合!
已知:二分图最大独立集合 = 节点数 - 最大匹配数
代码:
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

const int N = 1005;

int pre[N];
bool map[N][N], flag[N];
int n;

int find(int cur)   //匈牙利算法
{
    int i;
    for(i = 0; i < n; i++)
    {
        if(map[cur][i] && !flag[i])
        {
            flag[i] = true;
            if(pre[i] == -1 || find(pre[i]))
            {
                pre[i] = cur;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int i, j, r, k, num, sum;
    while(scanf("%d", &n) != EOF)
    {
        memset(map, false, sizeof(map));
        memset(pre, -1, sizeof(pre));
        for(i = 0; i < n ; i++)
        {
            scanf("%d: (%d)", &k, &num);    //输入格式注意!
            for(j = 0; j < num; j++)
            {
                scanf("%d", &r);
                map[k][r] = true;   //建表时
            }
        }
        sum = 0;
        for(i = 0; i < n; i++)
        {
            memset(flag, false, sizeof(flag));
            sum += find(i);
        }
        sum /= 2;   //二分图具有对称性,最大匹配数 /= 2
        //二分图最大独立集合 = 节点数 - 最大匹配数
        printf("%d\n", n - sum);
    }

    return 0;
}
 
0
5
分享到:
评论

相关推荐

    二分匹配题集

    1. **Girls and Boys (HDU 1068)** - **知识点**:本题考察的是最大匹配的基础概念。通常可以通过匈牙利算法或Kuhn-Munkres算法(KM算法)解决。 - **解题思路**:建立二分图,一边是男孩,另一边是女孩,然后...

    二分图的完美匹配 KM算法.docx

    二分图的完美匹配是指在一个图中,每个顶点恰好被一条边连接,使得图中的所有顶点都被连接且没有多余未使用的边。在实际应用中,二分图的完美匹配常常出现在分配问题、调度问题等领域。KM算法,即Kuhn-Munkres算法,...

    hdu.rar_hdu

    "hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在HDU上解决过的题目代码集合。这些代码通常包含了对各种算法的应用,例如排序、搜索、图论、动态规划等,对于学习算法和准备编程竞赛的初学者来说是一份宝贵...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    hdu动态规划算法集锦

    - **问题描述**:求直方图中最大的矩形面积。 - **解题思路**: - 使用单调栈辅助计算。 - 定义状态$Area = height[i] * (j - k + 1)$,其中$j$和$k$分别为左右边界。 - 计算左右边界时,可以使用两次单调递减栈...

    模式识别_hdu_期末复习资料集合_试卷笔记.zip

    在本压缩包文件“模式识别_hdu_期末复习资料集合_试卷笔记.zip”中,我们可以期待找到与杭州电子科技大学(HDU)模式识别课程相关的期末复习资料,可能包括过去的试卷、笔记和其他学习材料。 模式识别的基本概念...

    我的ACM个人模板模板

    具体来说,我们将每个顶点和它对应的另一个集合中的“影子”顶点关联起来,如果在遍历过程中发现某个顶点与其“影子”顶点在一个集合中,则说明存在奇数长度的环,从而该图不是二分图。 - **实现代码**: ```cpp ...

    hdu acm 教案(10)

    目标是找到最大的独立边集,即没有共同顶点的边的集合,这样的集合被称为匹配。 二分匹配的算法有很多种,其中最为著名的是匈牙利算法,也称Kuhn-Munkres算法。这个算法基于增广路径的概念,通过迭代过程不断寻找并...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU1059的代码

    HDU1059的代码

    ACM HDU

    指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合。...

    hdu1001解题报告

    hdu1001解题报告

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    HDU ACM 培训资料

    这个课件可能介绍了二分图的定义、性质,以及最大匹配算法,如Kuhn-Munkres算法或匈牙利算法。 10. **课件10: 母函数及其应用_new** 母函数是解决序列和问题的有效工具,尤其在处理递推序列时。这个课件可能解释了...

    HDU最全ac代码

    "HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码集合,旨在帮助学习者理解和掌握各种算法,提升编程解决问题的能力。 首先,我们来了解一下ACM/ICPC比赛。这是一项全球性的编程竞赛,参赛...

Global site tag (gtag.js) - Google Analytics