【匈牙利算法】 二分图模板 poj 1274

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int n,m,num,temp,sum;
int re[201][201],link[201];//牛与牛栏的对应关系
bool tag[201];//增益路径
bool DFS(int a)
{
    for(int i=1;i<=m;i++)
    {
        if(re[a][i]!=0 && !tag[i])//如果节点i与a相邻并且未被查找过
        {
            tag[i]=true;//标记i为已查找过
            if(link[i]==-1||DFS(link[i]))//i在匹配M中,但是从与i相邻的节点出发可以有增广路
            {
                link[i]=a;//记录查找成功记录
//                cout << "sucess i=" << i << "   link[i]= "<<link[i] <<endl;
                return true;//返回查找成功
            }
        }
    }
    return false;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(cin>>n>>m) // cow stall
    {
        int i,j,sum=0;
        memset(re,0,sizeof(re));
        memset(link,-1,sizeof(link));
        for(i=1;i<=n;i++)
        {
            cin>>num;
            for(j=1;j<=num;j++)
            {
                cin>>temp;
                re[i][temp]=1;
            }
        }//初始化
        for(i=1;i<=n;i++)   //cow
        {
            for(j=1;j<=m;j++)   //stall
            {
                tag[j]=false;
            }
            if(DFS(i))//从节点i尝试扩展
            sum++;
        }
        cout << sum << endl;
    }
    return 0;
}
时间: 2024-11-06 12:56:17

【匈牙利算法】 二分图模板 poj 1274的相关文章

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

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

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

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]

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.如果有多个满足条

二分图最大匹配(匈牙利算法Dfs模板)

#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using namespace std; int n,m,g[maxn][maxn],ans,f[maxn],match[maxn]; int init() { int x=0;char s;s=getchar(); while(s<'0'||s>'9')s=getchar(); while(s>='0'&am

poj-1469-COURSES-二分图匹配-匈牙利算法(模板)

题意:N个学生,P个课程,问能不能找到课程的P个匹配. 思路:[早上睡醒了再写] 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 const int maxn = 555; 7 int n, p; 8 vector<int> g[maxn]; 9 int from[maxn

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

#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

匈牙利算法(模板)

预处理 二维数组 map[N][N];用来记录两点是否可以链接 一维数组 link[N];用来记录有哪个点占用了哪个点 一维数组 ok[N];判断点是否被用过 bool dfs(int a) { for(int i=0;i<N;i++)遍历后数组寻找有是否可以相连的 { 如果 没有相连并且没有被用过 那么 标记被用过并且进行下一步操作 判断一下这个点被占用 如果没有被占用 则记录这个点被a占用 返回真 表示a点找到对应点了 否则 重新调用一下dfs(link[i]) 如果返回值为真表示 在这个点

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

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