• 2776 寻找代表元(匈牙利算法)


    题目描述 Description

    广州二中苏元实验学校一共有n个社团,分别用1到n编号。
    广州二中苏元实验学校一共有m个人,分别用1到m编号。每个人可以参加一个或多个社团,也可以不参加任何社团。
    每个社团都需要选一个代表。谦哥希望更多的人能够成为代表。

    输入描述 Input Description

    第一行输入两个数n和m。
    以下n行每行若干个数,这些数都是不超过m的正整数。其中第i行的数表示社团i的全部成员。每行用一个0结束。

    输出描述 Output Description

    输出最多的能够成为代表的人数。

    样例输入 Sample Input

    4 4
    1 2 0
    1 2 0
    1 2 0
    1 2 3 4 0

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    各个测试点1s

    数据范围
    n,m<=200

    #include<iostream>
    #include<cstring>//用于调用memset函数
    using namespace std;
    int f[201][201],used[201],st[201]={0};
    int n,m,ans=0;
    int find(int y)//匈牙利算法
    {
    for (int i=1;i<=m;i++)
    {
    if (f[y][i]&&used[i]==0)
    {
    used[i]=1;//标记人i已经被查找更改过
    if (st[i]==0||find(st[i]))//人i还不是社团代表或可以人i可以将社团代表腾出给其他人
    {
    st[i]=y;
    return 1;//人i可以担任社团代表
    }
    } 
    }
    return 0;
    }
    
    int main()
    { 
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    { 
    int x;
    cin>>x;
    while (x)
    {
    f[i][x]=1;
    cin>>x;
    }
    }
    for (int i=1;i<=n;i++)
    {
    memset(used,0,sizeof(used));
    if (find(i)) ans++;//统计社团代表人数
    }
    cout<<ans;
    
    return 0;
    }

     

    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    3.4.2内核下的I2C驱动
    AS3批量替换文件
    文件访问权限
    Windows快捷键
    整数与字符串之间的转换函数
    Windows获取文件大小
    Windows内核对象
    ASCII字符集
    IP协议
    获取真正的进程/线程句柄
  • 原文地址:https://www.cnblogs.com/sjymj/p/5187482.html
Copyright © 2020-2023  润新知