二分图 染色法 + 匈牙利算法

染色法判断二分图

const int N = 1e5 + 10, M = 2 * N;int e[M], ne[M], h[N], n, m, idx = 0, color[N];
void add(int a, int b){
   e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}

bool dfs(int u, int c)
{
   
    color[u] = c;           // 染色该点
    for(int i = h[u]; i != -1; i = ne[i])
    {
   
        int j = e[i];
        if(color[j] == 0)
        {
                      // 染色其连通点,如果存在染色矛盾,立即返回false
            if(dfs(j, 3 - c) == false)
                return false;
        }                   // 发生颜色矛盾,连通点的颜色相同
        else if(color[j] == c)
            return false;
    }
    return true;            // 对连通点的染色过程未发生矛盾
}

int main()
{
   
    fill(h, h + N, -1);
    cin >> n >> m;
    while(m--)
    {
   
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }
    
    bool flag = true;
    for(int i = 1; i <= n; ++i)
    {
   
        if(color[i] == 0)
            flag = dfs(i, 1); 
        if(flag == false)
            break;
    }
    if(flag)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

匈牙利算法求二分图最大匹配

const int N = 510, M = 1e5 + 10;
int n1, n2, m, h[N], e[M], ne[M], idx = 0;
int match[N];
bool visited[N];
void add(int a, int b){
   e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}

int find(int u)
{
   
    for(int v = h[u]; v != -1; v = ne[v])
    {
   
        int j = e[v];
        if(visited[j] == false)
        {
                              // 若j已有匹配,试找与其匹配的点
            visited[j] = true;      // 是否还有其他相连通且未发生匹配的点
            if(match[j] == 0 || find(match[j]))
            {
   
                match[j] = u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
   
    fill(h, h + N, -1);
    cin >> n1 >> n2 >> m;
    while(m--)
    {
   
        int a, b;
        cin >> a >> b;
        add(a, b);
    }
    
    int ret = 0;
    for(int i = 1; i <= n1; ++i)
    {
   
        fill(visited, visited + N, false);  // 每次查询一个点的匹配,都要置空
        if(visited[i] == false)             // match保证了已匹配的点的状态
        {
   
            if(find(i))
                ret++;
        }
    }
    cout << ret;
    return 0;
}

相关推荐

  1. 二分 染色法 + 匈牙利算法

    2024-01-27 02:44:03       30 阅读
  2. 算法学习笔记(二分染色

    2024-01-27 02:44:03       14 阅读
  3. 算法——论:判断二分染色问题)

    2024-01-27 02:44:03       17 阅读
  4. 二分查找(红蓝染色法

    2024-01-27 02:44:03       43 阅读
  5. 匈牙利算法的实现

    2024-01-27 02:44:03       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 02:44:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 02:44:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 02:44:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 02:44:03       18 阅读

热门阅读

  1. 常见的并联谐振应用案例

    2024-01-27 02:44:03       37 阅读
  2. ORA-32771: cannot add file to bigfile tablespace

    2024-01-27 02:44:03       29 阅读
  3. 【每日一题】YACS P11:双质数

    2024-01-27 02:44:03       41 阅读
  4. 【知识---git中一些常用的命令及其选项】

    2024-01-27 02:44:03       27 阅读
  5. Android 写入 csv 乱码,设置UTF-8的流也不行

    2024-01-27 02:44:03       43 阅读