• HDU 1068 Girls and Boys(最大独立集)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068

    题目大意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合中人的最大个数。

    解题思路:这题就是求最大独立集,但是这并不是两个集合,而是一个集合,所以求出最大匹配后需要/2,然后代公式:最大独立集=N-最大匹配。

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<vector>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N=1e5+5;
     8 vector<int>v[N];
     9 
    10 int n;
    11 int link[N];
    12 bool vis[N];
    13 
    14 bool dfs(int u){
    15     for(int i=0;i<v[u].size();i++){
    16         int t=v[u][i];
    17         if(!vis[t]){
    18             vis[t]=true;
    19             if(link[t]==-1||dfs(link[t])){ //如果t尚未被匹配,或者link[t]即x可以找到其他能够替代的点,则把t点让给u匹配
    20                 link[t]=u;
    21                 return true;
    22             }
    23         }
    24     }
    25     return false;
    26 }
    27 
    28 int max_match(){
    29     memset(link,-1,sizeof(link));
    30     int ans=0;
    31     for(int i=0;i<n;i++){
    32         memset(vis,false,sizeof(vis));
    33         if(dfs(i)) ans++;
    34     }
    35     return ans;
    36 }
    37 
    38 int main(){
    39     while(~scanf("%d",&n)){
    40         for(int i=0;i<=n;i++) v[i].clear();
    41         memset(link,-1,sizeof(link));
    42         for(int i=0;i<=n-1;i++){
    43             int num,t;
    44             scanf("%d: (%d)",&num,&t);
    45             for(int j=1;j<=t;j++){
    46                 int x;
    47                 scanf("%d",&x);
    48                 v[num].push_back(x);
    49             }
    50         }
    51         printf("%d
    ",n-max_match());
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    dataTables的导出Excel功能
    jquery生成二维码图片
    angular2表单初体验
    台湾辅仁大学的python教程笔记
    浅说《测试用例》----给测试新手的
    测试员的工作与学习
    简单的表格代码
    特殊效果字体代码
    办公自动化的基本方法
    css网页的几种类型
  • 原文地址:https://www.cnblogs.com/fu3638/p/8785040.html
Copyright © 2020-2023  润新知