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

poj1274

题意: 有n个奶牛, m个畜舍, 每个畜舍最多装1头牛,每只奶牛只有在自己喜欢的畜舍里才能产奶。 求最大产奶量。

分析: 其实题意很明显, 二分图的最大匹配, 匈牙利算法。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
using namespace std;

int n, m, sum, v[210], ans[210], map1[210][210];
int dfs(int x)//如果有增广路径返回1, 否则返回0
{
    for(int i = 1; i <= m; i++)
    {
        if(map1[x][i] == 1 && v[i] == 0)//有x-i边(牛x喜欢牛舍i) i没搜索过
        {
            v[i] = 1;
            //i是非匹配点,找到增广路径, 或者i是匹配点,从i继续往下找存在增广路径
            if(ans[i] == 0 || (ans[i] != 0 && dfs(ans[i]) == 1))
            {
                ans[i] = x;//记录牛舍i对应存放奶牛x
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(map1, 0, sizeof(map1));
        memset(ans, 0, sizeof(ans));
        int s, t;
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &s);
            for(int j = 1; j <= s; j++)
            {
                scanf("%d", &t);
                map1[i][t] = 1;
            }
        }
        sum = 0;
        for(int i = 1; i <= n; i++)
        {
            //v标记是否是搜索过, 每一次查询都从新初始化所有v为0(为搜索过)
            memset(v, 0, sizeof(v));
            int t = dfs(i);
            if(t == 1)
                sum++;
        }
        printf("%d\n", sum);
    }
    return 0;
}

时间: 2024-12-26 16:10:36

poj1274 匈牙利算法 二分图最大匹配的相关文章

匈牙利算法 二分图最大匹配题模板

[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一, 否则我们试图给原来匹配的y和x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配. 给x'寻找匹配的过程可以递归解决. [接口] int hungary(); 复杂度O(|E|*sqrt(|V|)) 输入

匈牙利算法 求最大匹配

不断找增广路,直到没有增广路,每找到一条增广路匹配数就加1 //hungary const int X=100,Y=100; int match[Y];// initial to -1 bool vis[Y]; int g[X][Y]; bool dfs(int x){ for(int y=1;y<=Y;y++){ if(g[x][y]&&!vis[y]){ vis[y]=1; if(match[y]==-1||dfs(match[y])){ match[y]=x; return t

匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

如下图:要求最多可以凑成多少对对象 ? 大佬博客:https://blog.csdn.net/cillyb/article/details/55511666 模板: int link[maxn],vis[maxn]; bool dfs(int x) { for(int i = 1; i <= num; i++) { if(!vis[i] && cp[x][i]) { vis[i] = 1; if(link[i] == 0 || dfs(link[i])) { link[i] = x;

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条

【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 8 using namespace std; 9 const int maxn=2e2

hdu2063 匈牙利算法 二分最大匹配模版题

过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或P

匈牙利算法(二分图匹配)

#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,m,k,ans,cnt,head[1001],vis[1001],match[1001]; struct uio{ int next,to; }edge[1000001

它处资料:二分图最大匹配的匈牙利算法

资料出处:点击打开链接 匈牙利算法 二分图最大匹配的匈牙利算法:  二分图是这样一个图,它的顶点能够分类两个集合X和Y,全部的边关联在两个顶点中.恰好一个属于集合X.还有一个属于集合Y. 最大匹配: 图中包括边数最多的匹配称为图的最大匹配. 完美匹配: 假设全部点都在匹配边上.称这个最大匹配是完美匹配. 最小覆盖: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和当中一个点关联.能够证明:最少的点(即覆盖数)=最大匹配数 最小路径覆盖: 用尽量少的不相交简单路径覆盖有向无环图G的全

POJ 1325 Machine Schedule (二分图最小点集覆盖 匈牙利算法)

Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12621   Accepted: 5399 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduli