p3386 二分图匹配模板

https://www.luogu.org/problemnew/show/P3386

可以只做一边的匹配

#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 7;
vector<int> G[maxN];
int match[maxN];
int vis[maxN];
int n, m, e, sum;
int dfs(int u) {

    for(int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        //有路而且没被访问
        if(!vis[v]) {
            vis[v] = 1;//标记点i已经访问过

            //如果点i未被配对或者找到了新的配对
            if(match[v] == 0 || dfs(match[v])) {
                //更新配对关系
                match[v] = u;
                return 1;
            }
        }
    }
    return 0;
}

int main() {
//    freopen("testdata.in","r", stdin);
    scanf("%d %d %d", &n, &m, &e);
    for(int i = 0; i < e; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        if(u > n || v > m) continue; //u总是在左边, 只做u的匹配
//        v += 10000;
        G[u].push_back(v);//只做一边建单向边
//        G[v].push_back(u);
    }

    memset(match, 0 , sizeof(match));

    for(int i = 1; i <= n; i++){
        memset(vis, 0, sizeof(vis));
        if(dfs(i)) {
            sum++;
        }
    }
    printf("%d\n", sum);

}

原文地址:https://www.cnblogs.com/Jadon97/p/9410726.html

时间: 2024-12-11 22:29:54

p3386 二分图匹配模板的相关文章

洛谷P3386——二分图匹配

题目:https://www.luogu.org/problemnew/show/P3386 二分图匹配模板,注意左部点只dfs未匹配点. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,e,a[1005],b[2005],ct,head[1005],pre[2005],ans; bool vis[1005],pe[1005]; struct

XidianOJ 1048 二分图匹配模板

题目描述 西电ACM实验室是一个很和谐的实验室,有n个男生和m个女生组成(m>0),尽管表面大家都全心全意地为了荣誉而战,然而经过亮亮的深入调查,我们已经知道了有一些人三心二意:每天只有99%的时间花费在切题上,而还有1%的时间在想着某位或某几位异性!作为FFF团西电分部的部长,亮亮显然不能容许这种朝三暮四的情况.但是西电ACM实验室又是一个很开明的实验室,于是亮亮决定尽可能的撮合实验室的队员! 那么问题来了,亮亮最多能撮合多少对呢? 输入 多组数据,每组数据首先是两个整数,n,m表示男女生的人

Kuhn-Munkres算法。带权二分图匹配模板 (bin神小改版本)

/****************************************************** 二分图最佳匹配 (kuhn munkras 算法 O(m*m*n)). 邻接矩阵形式 . 返回最佳匹配值,传入二分图大小m,n 邻接矩阵 map ,表示权,m1,m2返回一个最佳匹配,为匹配顶点的match值为-1, 一定注意m<=n,否则循环无法终止,最小权匹配可将全职取相反数. 初始化: for(i=0;i<MAXN;i++) for(j=0;j<MAXN;j++) mat

hdu-1179 Ollivanders: Makers of Fine Wands since 382 BC.---二分图匹配模板

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1179 题目大意: 有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人).接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号.最后问老板最多能卖出多少根魔杖.这个赤裸裸的模版题,套下就OK了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll;

小白菜OJ 1122 公牛母牛配(最大二分图匹配模板)

题意: n只公牛和m只母牛,某些公牛和某些母牛互相喜欢.但最后一只公牛只能和一只母牛建立一对一匹配.要使得最后牛群匹配对数最大. 链接: http://caioj.cn/problem.php?id=1122 #include <bits/stdc++.h> using namespace std; const int maxN = 1e5 + 7; vector<int> G[maxN]; int match[maxN]; int vis[maxN]; int n, m, sum

二分图匹配模板题

2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest 1 /************************************************************************* 2 > File Name: a.cpp 3 > Author: QWX 4 > Mail: 5 > Created Time: Fri 05 Oct 2018 06:37:54 AM PDT 6 ************

二分图匹配-匈牙利算法【学习】

首先二分图匹配的基础概念得清楚:二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图.匹配: 两两不含公共端点的边集合M称为匹配(简单的说就是右边的点只能连一条边)极大匹配: 指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数最大匹配: 所有极大匹配当中边数最大的一个匹配增广路: 若P是图G中一条连通两个未匹配顶

UVA 11045-My T-shirt suits me(二分图匹配)

题意:有N件T恤,N是6的倍数,因为有6种型号,每种件数相同,有M个人,每个人有两种型号的T恤适合他,每个人可以挑其中的一种,问能否所有的人都能分配到T恤. 解析:典型的二分图匹配,每N/6为同种T恤,对于单个人,将他与它适合的两种T恤的所有标号连边,最后计算最大匹配,如果小于M,则不可行,否则可行. 代码如下: #include<cstdio> #include<cstring> #include<string> #include<algorithm> #

HDU1083 :Courses(二分图匹配)

Cources Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11298    Accepted Submission(s): 5299 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083 Description: Consider a group of N students an