zoukankan      html  css  js  c++  java
  • 猫和狗

    猫和狗( 二分图(star ))

    • 时限:(1s) 内存:(256M)

    Descrption

    • (k)同学正在玩一个游戏,在游戏中他扮演了一个马戏团的老板,现在小 (k) 同学需要利用马戏团中的 (A) 只猫和 (B) 只狗举办一次表演,表演之前他让观众进行了投票,投票的类容是:我想看到第___号猫/狗的表演,不想看到第___号猫/狗的表演。
    • 注意到每个观众都是更喜欢猫或更喜欢狗,所以两个空后面一定会被勾上不同的内容。喜欢猫的观众会在第一空后面选择猫,第二空后面选择狗;反之就会在第一空后面选择狗,第二空后面选择猫。
    • 对于每一个观众,只有当他投票的内容都被满足了(即他想看到的动物出场表演,他不想看到的动物不参与表演)的时候,他才会来看表演。当然啦,看表演是要付门票钱的,作为马戏团的老板,小 (k) 自然是希望来的人越多越好了。他想找到一个安排动物表演的方案,使得来看表演的观众尽量多。

    Input

    • (1)(3) 个正整数 (n,m,k),分别表示猫、狗和观众的数量
    • (2sim k+1) 行,每行描述了一个观众的投票内容。
    • 首先输入一个字符 (C)(D) 紧接着是一个数字,表示某个观众想看到的动物,然后是一个空格隔开,接下去又是一个 (C)(D) 加上一个数字,表示这个观众不想看到的动物,同一行中一定不会出现两个 (C) 或两个 (D)

    Output

    • 输出一行一个正整数,表示小 (k) 在最优的安排下可以吸引多少观众来看表演。

    Sample Input

    1 2 4
    C1 D1
    C1 D1
    C1 D2
    D2 C1
    

    Sample Output

    3
    

    Hint

    • 对于 (25\%) 的数据:(n, m≤10, k≤25)
    • 对于 (100\%) 的数据:(n, m≤300, k≤500)
    • 来源:

    分析

    • 典型的二分图匹配,我们把喜欢 第(i) 号猫的人与不喜欢 (i) 号猫的人进行建边,同样把喜欢 (i) 号狗的人与不喜欢 (i) 号狗的人进行连线,然后跑匈牙利,求出最大匹配 (tot) ,这 (tot) 个人里只能有一半的人能互不冲突。

    Code

    #include <bits/stdc++.h>
    typedef long long LL;
    const int maxn=500+5;
    const LL Mod=1e9+7;
    int a[maxn][maxn],p[maxn];
    bool vis[maxn];
    int n;
    void Init(){
        int cat,dog;
        scanf("%d%d%d",&cat,&dog,&n);
        char s1[maxn][10],s2[maxn][10];
        for(int i=1;i<=n;++i)
            scanf("%s%s",s1[i],s2[i]);
        for(int i=1;i<=n;++i)//建边i和j不能共存
            for(int j=1;j<=n;++j)
                if(!strcmp(s1[i],s2[j]))
                    a[i][j]=a[j][i]=1;
    }
    bool Find(int x){//匈牙利
        for(int i=1;i<=n;++i){
            if(a[x][i] && vis[i]==0){
                vis[i]=1;
                if(!p[i] || Find(p[i])){
                    p[i]=x;
                    return 1;
                }
            }
        }
        return 0;
    }
    void Solve(){
        int tot=0;
        for(int i=1;i<=n;++i){
            memset(vis,0,sizeof(vis));
            if(Find(i))tot++;
        }
        printf("%d
    ",n-tot/2);
    }
    int main(){
        Init();
        Solve();
        return 0;
    }
    
  • 相关阅读:
    学生信息表
    水仙花数
    DirectAccess完整配置
    这些惹人嫌系统安装方法
    求解方程式
    AD DS的维护之备份还原
    简单的switch语句
    linux_常用命令
    小小问题
    frameset和frame
  • 原文地址:https://www.cnblogs.com/hbhszxyb/p/13439187.html
Copyright © 2011-2022 走看看