码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-27 22:46:28      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

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;
}
View Code

 

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

标签:

原文地址:http://www.cnblogs.com/wd-one/p/4534555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!