zoukankan      html  css  js  c++  java
  • POJ

    题目大意:有n个点,m条单向线段。如今问要从几个点出发才干遍历到全部的点

    解题思路:二分图最大匹配,仅仅要一条匹配,就表示两个点联通,两个点联通仅仅须要选取当中一个点就可以,所以有多少条匹配。就能够减去多少个点

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N = 130;
    int g[N][N], vis[N], link[N];
    int n, m;
    
    void init() {
        memset(g, 0, sizeof(g));
        memset(link, 0, sizeof(link));
        int x, y;
        for(int i = 0; i < m; i++) {
            scanf("%d%d", &x, &y);
            g[x][y] = 1;
        }
    }
    
    bool dfs(int u) {
        for(int i = 1; i <= n; i++) {
            if(!vis[i] && g[u][i]) {
                vis[i] = 1;
                if(!link[i] || dfs(link[i])) {
                    link[i] = u;
                    return true;
                }
            }
        }
        return false;
    }
    
    void hungary() {
        int ans = 0;
        for(int i = 1; i <= n; i++) {
            memset(vis, 0, sizeof(vis));
            if(dfs(i))
                ans++;
        }
    
        printf("%d
    ", n - ans);
    }
    
    int main() {
        int test;
        scanf("%d", &test);
        while(test--) {
            scanf("%d%d", &n, &m);
            init();
            hungary();
        }
        return 0;
    }
    
  • 相关阅读:
    (转载)Linux进程基础
    C语言字符串
    DNS域名解析服务
    Linux-SSH远程管理
    Linux文件系统深入了解
    Linux进程和计划任务管理
    Linux账户与权限管理
    MySQL实现读写分离
    SQL数据库常用函数
    MySQL进阶查询(二)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5092671.html
Copyright © 2011-2022 走看看