• hdu3829(最大独立集)


    传送门:Cat VS Dog

    题意:动物园有N只猫,M只狗,P个小孩。每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫。某个小孩能开心,当且仅当他喜欢的动物留在动物园和讨厌的动物不在动物园里面。 现让管理员通过带走某些动物,问最多能使多少个孩子开心。 

    分析:为了让尽量多的孩子开心,那么要选出一个最大的集合里面的点没有矛盾,因此根据孩子之间有矛盾建边,然后选出最大独立集即可。

     最大独立集=总结点-最大匹配数。因为拿整个二分图来求最大匹配,而不是具体分出X,Y二部分来求,因此最后的匹配数要除以2.

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 100000000
    #define inf 0x3f3f3f3f
    #define eps 1e-6
    #define N 1000
    #define FILL(a,b) (memset(a,b,sizeof(a)))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define PII pair<int,int>
    using namespace std;
    int match[N],vis[N],n,m,k;
    vector<int>g[N];
    int dfs(int u)
    {
        for(int i=0,sz=g[u].size(); i<sz; i++)
        {
            int v=g[u][i];
            if(!vis[v])
            {
                vis[v]=1;
                if(match[v]==-1||dfs(match[v]))
                {
                    match[v]=u;
                    return 1;
                }
            }
        }
        return 0;
    }
    int hungary()
    {
        FILL(match,-1);
        int ans=0;
        for(int i=1; i<=k; i++)
        {
            FILL(vis,0);
            if(dfs(i))ans++;
        }
        return ans;
    }
    char like[N][5],dislike[N][5];
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&k)>0)
        {
            for(int i=1; i<=k; i++)
                g[i].clear();
            for(int i=1; i<=k; i++)
            {
                scanf("%s%s",like[i],dislike[i]);
            }
            for(int i=1; i<=k; i++)
                for(int j=i+1; j<=k; j++)
                    if(strcmp(like[i],dislike[j])==0||strcmp(like[j],dislike[i])==0)
                    {
                        g[i].push_back(j);
                        g[j].push_back(i);
                    }
            int res=hungary();
            printf("%d
    ",k-res/2);
        }
    }
    View Code
  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/lienus/p/4287049.html
Copyright © 2020-2023  润新知