poj 2771 Guardian of Decency(最大独立数)

题意:人与人之间满足4个条件之一即不能成为一对(也就说这4个条件都不满足才能成为一对),求可能的最多的单身人数。

思路:把男女分为两部分,接下来就是二分图的匹配问题。把能成为一对的之间连边,然后求出最大匹配。题目要求的是最大独立数。

最大独立数=顶点数-最大匹配数

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

#define MAXN 1024

struct person{
    int h;
    char music[105];
    char sport[105];
}male[MAXN],female[MAXN];

int n,m,k,x,y,pre[MAXN];
//二分图中X集和Y集的节点数各为n、m,边数为k;匹配边集为pre,其中节点i所在的匹配边为(pre[i],i)
bool v[MAXN],a[MAXN][MAXN];
//设二分图相邻矩阵为a,Y集合中节点的访问标志为v,若Y集合中的节点j已访问,则v[j]=true

bool dfs(int i){//判断以X集合中的节点i为起点的增广路径是否存在
    int j;
    for(j=0; j<m; j++){
        if(!v[j]&&a[i][j]){//搜索所有与i相邻的未访问点
            v[j]=1;//访问节点j
            if(pre[j]==-1||dfs(pre[j])){
                //若j的前驱是未盖点或者存在由j的前驱出发的增广路径,则设定(i,j)为匹配边,返回成功标志
                pre[j]=i;
                return true;
            }
        }
    }
    return false;//返回失败标志
}

int main(){
    int t,num,h;
    char sex[2];
    int i,j,ans;
    scanf("%d",&t);
    while(t--){
        memset(a,0,sizeof(a));//二分图的相邻矩阵初始化
        memset(pre,-1,sizeof(pre));//匹配边集初始化为空
        n=m=0;
        scanf("%d",&num);
        while(num--){
            scanf("%d%s",&h,sex);
            if(sex[0]==‘M‘){
                male[n].h=h;
                scanf("%s%s",male[n].music,male[n].sport);
                ++n;
            }
            else{
                female[m].h=h;
                scanf("%s%s",female[m].music,female[m].sport);
                ++m;
            }
        }
        for(i=0;i<n;++i){
            for(j=0;j<m;++j){
                if(abs(male[i].h-female[j].h)<=40&&strcmp(male[i].music,female[j].music)==0&&strcmp(male[i].sport,female[j].sport)!=0)
                    a[i][j]=1;
            }
        }
        ans=0;//匹配边数初始化为0
        for(i=0; i<n; i++){//枚举X集的每个节点
            memset(v,0,sizeof(v));//设Y集合中的所有节点的未访问标志
            if(dfs(i)) ans++;//若节点i被匹配边覆盖,则匹配边数+1
        }
        printf("%d\n",n+m-ans);
    }
    return 0;
}

时间: 2024-10-12 04:42:31

poj 2771 Guardian of Decency(最大独立数)的相关文章

poj——2771 Guardian of Decency

poj——2771    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5916   Accepted: 2458 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he i

poj 2771 Guardian of Decency【最大点独立集】

K - Guardian of Decency Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2771 Appoint description:  System Crawler  (2014-08-17) Description Frank N. Stein is a very conservative high-school teac

poj 2771 Guardian of Decency 解题报告

题目链接:http://poj.org/problem?id=2771 题目意思:有一个保守的老师要带他的学生来一次短途旅行,但是他又害怕有些人会变成情侣关系,于是就想出了一个方法: 1.身高差距  > 40cm 2.相同性别 3.喜欢的音乐种类  不同 4.有共同喜爱的 运动 只要满足其中这4个条件中的一个(当然越多越好啦),就可以将他们编为一组啦(一组两个人),求能被编为一组的最多组数. 这题实质上求的是二分图的最大独立集.  最大独立集 = 顶点数 - 最大匹配数 可以这样转化:两个人至少

poj 2771 Guardian of Decency

Guardian of Decency http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K       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 som

POJ 2771 Guardian of Decency (二分图最大点独立集)

Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2555 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

POJ - 2771 Guardian of Decency 二分图 最大匹配数

题目大意:有n个人要参加一项活动,活动要求参加的人里面尽量不要有couples,主办方提出了四个降低couples的方法: 1.两个人的身高差大于40 2.性别相同 3.喜欢的音乐风格不同 4.喜欢的运动相同 只要满足其中的一项就认定两人不是couples 现在给出n个人的四项数据,问最多能邀请到多少人 解题思路:这题和Poj 1466 Girls and Boys这题很相似,只不过这题给的条件不是直接给出的,而是要我们自己去找的 只要两个人四个条件都不满足,就可以认为他们是couples了(相

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 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

UVA 12083 - Guardian of Decency(二分图最大匹配)

UVA 12083 - Guardian of Decency 题目链接 题意:给定一些男女,满足身高差不大于40,喜欢同一种音乐,不喜欢同一种体育项目,并且性别不同,就可能发生关系,现在老师要带一些男女出去玩,要求不能有一对发生关系,问最多能带多少人 思路:分男女,把会发生关系的连边,然后做最大匹配,最后n-最大匹配就是最多能带的人 代码: #include <cstdio> #include <cstring> #include <string> #include

POJ 2771 最大点独立集

这是经典的最大点独立集 还是可以转化成最大匹配数,为什么呢,因为求出最大匹配数之和,匹配的边的两个端点互斥,只能去一个,所以最后结果就用总点数-最大匹配数即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int h[600],sex[600]; char music[600][200],ball[600][