zoukankan      html  css  js  c++  java
  • 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+m-ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    WPF数据绑定之Ado.net的数据库连接绑定
    asp.net 网站js弹出提示后原页面css样式丢失
    Javascript中函数重载的实现
    JavaScript的继承
    WPF数据绑定之4种绑定模式
    Asp.net输出Excel文件并且下载该文件以及某些细节问题解决
    js 验证身份证 带X
    WPF的数据绑定之控件源绑定以及代码方式绑定
    WPF数据绑定之DataContext
    在无cookie模式中,会话话状态的ID将会自动保存在ASP.NET的查询字符串中
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4772686.html
Copyright © 2011-2022 走看看