hihocoder 1122 二分图最大匹配之匈牙利算法

  题目链接:http://hihocoder.com/problemset/problem/1122 , 匈牙利算法裸题。

  刚刚学的二分匹配,还是要多刷题。



  这道题可以直接套模板,我是根据题目上面的来做的,所以就先加了个染色优化,效果一般吧。

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
#define INF 1e8
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int MOD = 2333333;
const int maxn = 1000 + 5;
vector <int> e[maxn];
int color[maxn] , match[maxn] , vis[maxn];

void DFS(int s)
{
    for(int i = 0 ; i < e[s].size() ; i++) {
        int j = e[s][i];
        if(!color[j]) {
            color[j] = 3 - color[s];
            DFS(j);
        }
    }
}
bool find(int v)
{
    if(vis[v])
        return false;
    vis[v] = 1;
    for(int i = 0 ; i < e[v].size() ; i++) {
        int u = e[v][i];
        if(!vis[u]) {
            vis[u] = 1;
            if(!match[u] || find(match[u])) {
                match[u] = v;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int n , m , u , v , res = 0;
    scanf("%d %d" , &n , &m);
    memset(color , 0 , sizeof(color));
    memset(match , 0 , sizeof(match));
    while(m--) {
        scanf("%d %d" , &u , &v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i = 1 ; i <= n ; i++) {
        if(!color[i]) {
            color[i] = 1;
            DFS(i);
        }
    }
    for(int i = 1 ; i <= n ; i++) {
        if(color[i] == 1) {
            memset(vis , 0 , sizeof(vis));
            res += find(i);
        }
    }
    printf("%d\n" , res);
}
时间: 2024-09-27 01:33:51

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

hihoCoder #1122 : 二分图二?二分图最大匹配之匈牙利算法

#1122 : 二分图二•二分图最大匹配之匈牙利算法 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了.因为过年时间并不是很长,所以姑姑希望能够尽可能在一天安排比较多的相亲.由于一个人同一天只能和一个人相亲,所以要从当前的相亲情况表里选择尽可能多的组合,且每个人不会出现两次.不知道有没有什么好办法,对于当前给定的相亲情况表,能够算出最多能同时

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

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

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.

HDU ACM 1281 棋盘游戏-&gt;二分图最大匹配(匈牙利算法实践)

分析:该題可以用x坐标去匹配y坐标,匹配成功一次就是一个可放棋子的点,最后求得的的二分图最大匹配就是可以放的最大棋子数.求二分图的最大匹配使用匈牙利算法.之后通过删除一条边来判断一个点是否为关键点,若删边后,最大匹配数不变则不是,否则是,通过分别删除每个点进行测试,最终即可算出关键点的个数. #include<iostream> using namespace std; #define N 102 int map[N][N]; //记录连接x和y的边 bool vis[N]; //记录y中节点

算法练习系列—hiho1122二分图最大匹配之匈牙利算法

题目地址:http://hihocoder.com/problemset/problem/1122 该题目的关键是2个问题:1点用bfs构造二分图   2:针对二分图的其中S中的结点,遍历找增广路(匈牙利算法求二分图的最大匹配) 每找到一条增广路就多找到了一条匹配. 代码如下: /* 这题有两点需要注意:1点用bfs构造二分图 2:针对二分图的其中S中的结点,遍历找增广路(匈牙利算法求二分图的最大匹配) 每找到一条增广路 就多找到了一条匹配 */ #include <iostream> #in

51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左边的点和没用过的右边的点连起来, 如果遇到一个点已经连过就试着把原来的拆掉 把现在这条线连起来看能不能多连上一条线. 总结来说就是试和拆,试的过程很简单,拆的过程由于使用递归写的,很复杂.很难讲清楚,只能看代码自己理会. 代码(有注释): #include <bits\stdc++.h> usin

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

首先是二分图定义与判断  http://www.cnblogs.com/wenruo/p/5243034.html 给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不连接同一个顶点,则称M是一个匹配. 一个很好的比喻是,一个二分图,左边代表男生,右边代表女生,连线代表有好感,匹配就是把他们互相有好感的撮合起来.当然,要一夫一妻! 所谓最大匹配,就是撮合最多对.(写下这句话的时候,我在图书馆,旁边有一对情侣在虐狗……) 完美匹配就是所有的人都不落单. 上图红线代表一个匹配,图中

【模板】 二分图最大匹配和匈牙利算法

1 bool dfs(int u) 2 { 3 for (iterator_t i = G[u].begin(); i != G[u].end(); ++i) { // 对 u 的每个邻接点 4 int v = edges[*i].to; 5 if (!check[v]) { // 要求不在交替路中 6 check[v] = true; // 放入交替路 7 if (matching[v] == -1 || dfs(matching[v])) { 8 // 如果是未盖点,说明交替路为增广路,则交

hihocoder 1122最大二分匹配匈牙利算法

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st