POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)

解题报告

http://blog.csdn.net/juncoder/article/details/38159017

题目传送门

题意:

看到题目我就笑了,,,

老师认为这样的两个学生不是一对:

身高相差40以上(年龄都不是距离了,身高又算什么)

不同性别(sad,,,就不允许基友存在呀,,,谁的肥皂掉了,,,)

喜欢不一样的歌曲类型(你总不能要求两人整天听小苹果吧,,,,,,你是我的小丫小苹果,,,,,,)

喜欢一样的运动( they are likely to be fans of different teams and that would result in fighting......这是什么理由,喜欢同个不同球队还会打起来)

问最多的不在一起的有多少人

思路:

不在一起代表独立于相爱关系的,也就是求最大独立集,集合里面任意两个人都不相爱

最大独立集=结点数-最大匹配

ps不知道是不是写挫了,重写才过,sad。。。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
    int h;
    char sex;
    char mus[110];
    char spo[110];
}M[510],F[510];
int n,m,f,mmap[550][550],pre[550],vis[550];
int pd(int i,int j)
{
    if( abs(M[i].h - F[j].h) > 40 )
        return 0;
    if( strcmp(M[i].mus,F[j].mus) )
        return 0;
    if( strcmp(M[i].spo,F[j].spo) == 0 )
        return 0;
    return 1;
}
int dfs(int x)
{
    for(int i=m+1;i<=m+f;i++){
        if(!vis[i]&&mmap[x][i]){
            vis[i]=1;
            if(pre[i]==-1||dfs(pre[i])){
                pre[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,t,h;
    char str[100];
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        m=f=1;
        memset(mmap,0,sizeof(mmap));
        memset(pre,-1,sizeof(pre));
        memset(M,0,sizeof(M));
        memset(F,0,sizeof(F));
        for(i=1;i<=n;i++){
            scanf("%d%s",&h,str);
            if(str[0]=='M'){
                scanf("%s%s",M[m].mus,M[m].spo);
                M[m].h=h;
                M[m++].sex='M';
            }
            else {
                scanf("%s%s",F[f].mus,F[f].spo);
                F[f].h=h;
                F[f++].sex='F';
            }
        }
        for(i=1;i<=m;i++){
            for(j=1;j<=f;j++){
                if(pd(i,j))
                mmap[i][m+j]=1;
            }
        }
        int ans=0;
        for(i=1;i<=m;i++){
            memset(vis,0,sizeof(vis));
            ans+=dfs(i);
        }
        printf("%d\n",n-ans);
    }
}

Guardian of Decency

Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 4876   Accepted: 2056

Description

Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is afraid that some of them might become couples. While you can never exclude this possibility, he has made some rules that he thinks indicates
a low probability two persons will become a couple:

  • Their height differs by more than 40 cm.
  • They are of the same sex.
  • Their preferred music style is different.
  • Their favourite sport is the same (they are likely to be fans of different teams and that would result in fighting).

So, for any two persons that he brings on the excursion, they must satisfy at least one of the requirements above. Help him find the maximum number of persons he can take, given their vital information.

Input

The first line of the input consists of an integer T ≤ 100 giving the number of test cases. The first line of each test case consists of an integer N ≤ 500 giving the number of pupils. Next there will be one line for each pupil consisting of four space-separated
data items:

  • an integer h giving the height in cm;
  • a character ‘F‘ for female or ‘M‘ for male;
  • a string describing the preferred music style;
  • a string with the name of the favourite sport.

No string in the input will contain more than 100 characters, nor will any string contain any whitespace.

Output

For each test case in the input there should be one line with an integer giving the maximum number of eligible pupils.

Sample Input

2
4
35 M classicism programming
0 M baroque skiing
43 M baroque chess
30 F baroque soccer
8
27 M romance programming
194 F baroque programming
67 M baroque ping-pong
51 M classicism programming
80 M classicism Paintball
35 M baroque ping-pong
39 F romance ping-pong
110 M romance Paintball

Sample Output

3
7
时间: 2024-11-05 00:14:03

POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)的相关文章

POJ1466 Girls and Boys【二分图最大独立集】

题目链接: http://poj.org/problem?id=1466 题目大意: 有N个学生,他们之间的某些人比较暧昧,只有认识的人能组成一个集合.问:最多能组成 多少个集合,使得这几个集合之间的学生都没有任何关系. 思路: 从N个图中选出M个点,使得这M个点两两之间没有边,求最大的M是多少.二分图最大独立 集问题.本来应该以男生.女生各一边建二分图求最大独立集,但是这里只有N个点,没有告 诉男生.女生的编号.那么以N个学生为一边.再以N个学生为另一边.将相互联系的人之间 建边.然后求最大匹

hihocoder 1158 质数相关 (二分图最大独立集 最大流ISAP求解)

#1158 : 质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二

杭电1068--Girls and Boys(二分图最大独立集)

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

[luoguP3355] 骑士共存问题(二分图最大独立集)

传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建立附加源S汇T,从S向X集合中每个顶点连接一条容量为1的有向边,从Y集合中每个顶点向T连接一条容量为1的有向边. 从每个可用的黑色格子向骑士一步能攻击到的可用的白色格子连接一条容量为无穷大的有向边. 求出网络最大流,要求的结果就是可用格子的数量减去最大流量. 分析 用网络流的方法解决棋盘上的问题,一

hdu1068 Girls and Boys,二分图最大独立集

点击打开链接 二分图最大独立集 = 顶点数 - 最大匹配数 #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1005; int g[maxn][maxn]; int n; int link[maxn]; bool used[maxn

HDU 3829 - Cat VS Dog (二分图最大独立集)

题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动物被移走,这个小孩会很高兴.现在问最多可以让多少个小孩高兴. 此题是求二分图最大独立集. 二分图比较明显,但是难在建图.这个题是找到最多的喜欢猫和喜欢狗而不互相冲突的小孩,这样我们将喜欢动物相互冲突的小孩之间连边,问题就变成了求二分图的最大独立集. 在二分图中,最大独立集=顶点数-最大匹配数. 求解

Girls and Boys POJ - 1466 【(二分图最大独立集)】

Problem DescriptionIn 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

TopCoder12808 「SRM594Medium」FoxAndGo3 二分图最大独立集

问题描述 一个 \(N \times N\) 围棋棋盘,任意两个白子不相邻,你要加入若干个黑子并提出白子,最大化空格数目. submit 题解 显然最终棋盘的局面不能够一个白子和它周围的空格都是空的,只能属于 「空」 或 「不空」 . 所以是个二分图. 二分图最大独立集=总点数-二分图最大匹配 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; //#define file //#define local const i

hdu 3829 二分图最大独立集

将孩子看做点,两个孩子间存在矛盾关系则连一条边,最后求二分图最大独立集即可 // // main.cpp // hdu3829 // // Created by Fangpin on 15/5/29. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <vector>