XidianOJ 1048 二分图匹配模板

题目描述

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

那么问题来了,亮亮最多能撮合多少对呢?

输入

多组数据,每组数据首先是两个整数,n,m表示男女生的人数(0<n,m<=500).

接下来是一个整数l(0<=l<=200000)表示亮亮搜集得到的关系

接下来是l行,每行是两个数u,v(0<=u<n,0<=v<m)

表示第u位男生和第v位女生有情况!

由于ACM实验室是个和谐的大家庭,因此不会出现同性恋。

输出

对于每组数据,输出一个整数,表示亮亮能撮合的对数。

--正文

二分图匹配模板

用匈牙利算法解决

话说给的样例有错吧,明明u<n的给个2。。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;

int love[501][501]; // boy in the front
int match[501];
bool visit[501];
bool dfs(int u){
    int i;
    for (i=0;i<m;i++){
        if (love[u][i] && !visit[i]){
            visit[i] = true;
            if (match[i] == -1 || dfs(match[i])){
                match[i] = u;
                return true;
            }
        }

    }
    return false;
}

int main(){
    while (scanf("%d %d",&n,&m) != EOF){
        int l;
        scanf("%d",&l);
        int i,j;
        memset(love,0,sizeof(love));
        for (i=0;i<501;i++){
            match[i] = -1;
        }

        for (i=1;i<=l;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            love[u][v] = 1;
        }
        int ans = 0;
        for (i=0;i<n;i++){
            memset(visit,false,sizeof(visit));
            if (dfs(i)) ans ++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-28 16:18:40

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

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

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].si

二分图匹配模板题

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> #

洛谷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

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