最大独立集 HDU 1068

题目大意:有n个人,两个人之间有相互的关系,问最大的关系数目。

思路:n-(最大匹配数/2)。因为这里给出的是n个人之间的两两关系

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha; printf("haha\n");
const int maxn = 500 + 5;
int myleft[maxn];
int T[maxn];
bool vis[maxn][maxn];
vector<int> G[maxn];
int n;

bool match(int u){
    int len = G[u].size();
    for (int i = 0; i < len; i++){
        int v = G[u][i];
        if (!T[v]){
            T[v] = true;
            if (myleft[v] == -1 || match(myleft[v])){
                myleft[v] = u;
                return true;
            }
        }
    }
    return false;
}

int main(){
    while (scanf("%d", &n) == 1){
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                vis[i][j] = false;
            }
            G[i].clear();
        }
        for (int i = 1; i <= n; i++){
            int k, u;
            scanf("%d: (%d)", &u, &k);
            for (int i = 0; i < k; i++){
                int v; scanf("%d", &v);
                G[u].push_back(v);
                vis[u][v] = true;
            }
        }
        memset(myleft, -1, sizeof(myleft));
        int ans = 0;
        for (int i = 0; i < n; i++){
            memset(T, 0, sizeof(T));
            ans += match(i);
        }
        for (int i = 0; i < n; i++){
            printf("left[%d] = %d\n", i, myleft[i]);
        }
        printf("%d\n", n - ans / 2);
    }
    return 0;
}

时间: 2024-10-21 02:50:11

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

Girls and Boys HDU - 1068 二分图匹配(匈牙利)+最大独立集证明

最大独立集证明参考:https://blog.csdn.net/qq_34564984/article/details/52778763 最大独立集证明: 上图,我们用两个红色的点覆盖了所有边.我们证明的前提条件是已经达到最小覆盖. 即条件1.已经覆盖所有边,条件2.所用的点数最小 首先我们来证明蓝色点组成的是一个独立集:如果有两个蓝色点间有边相连,那么这条 边则没有被覆盖,则与条件1矛盾.因此是独立集. 再来证明这个独立集最大: 如果我们要再增加这个独立集中的点,则需要把某个红点变 成蓝点.而

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

Girls and Boys Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 11141   Accepted: 4983 Description In the second year of the university somebody started a study on the romantic relations between the students. The relation "romantically in

HDU 1068

[原题] http://acm.hdu.edu.cn/showproblem.php?pid=1068 [类型] 二分图最大独立集(最大二分匹配) [题意] 题目给定一些男女生之间相互的romantic关系,要求找出一个最大的集合,使得该集合中的所有男女生之间都不存在romantic关系. [分析] 一个二分图的最大独立集点数与最大二分匹配个数有直接的关系: 最大独立集点数 = 顶点数 - 最大二分匹配对数 故本题直接转化为求最大二分匹配即可,需要注意的是,题中给出的条件是1指向2,2也会指向1

[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