关闭

二分图最大匹配(邻接表法)

170人阅读 评论(0) 收藏 举报
分类:

二分图最大匹配(邻接表法)

题目链接:https://cn.vjudge.net/contest/181019#problem/F

题目大意:给你一个n*n的矩阵,问你能不能从这个矩阵的所有对角线上各取一个数,这2n-1个数各不相同,如果能,输出这些数,不能就输出NO,,,这些数的范围是1-10的9次方,,,

这题用二分图匹配做,将这些对角线当做男生,将这些对角线上的数当做女生,将这个数在这条对角线上当做关系,然后就是男生去找女生,要求的是找的最多的有多少男生,如果有2n-1个男生能匹配心仪的女生,就输出YES,否则输出NO,

这题最坑的地方就是,,这些数的范围太大,不能用二维的数组来存储他们之间的关系,所以要用到邻接表来存储,,,具体实现看代码

AC代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <stack>
#include <cctype>
#include <set>
#include <ctype.h>
#include <string.h>
#define inf 999999999
#define eps 0.000001
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long ll;
const int maxn=300*300+10;
set<int>p[maxn];
vector<int>e[maxn];
map<int,int>q;
set<int>vis;//判断某个数是否已经用过
int ans[600+10];
int s[310][310];
int dfs(int x)
{
    for(int i=0;i<e[x].size();i++)
    {
        int t=e[x][i];
        if(!vis.count(t))
        {
            vis.insert(t);
            if(!q[t]||dfs(q[t]))
            {
                q[t]=x;//q[t]表示t这个数(t就相当于这个女生是否名花无主或者可以换个男生对象)是否有主了
                ans[x]=t;//有主了记录t这个数的主人是哪条对角线
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int n;
    //cin>>n;
    scanf("%d",&n);
    for(int i=0;i<maxn;i++)
        e[i].clear();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            //cin>>s[i][j];
            scanf("%d",&s[i][j]);
            if(!p[n-j+i].count(s[i][j]))
            {
                p[n-j+i].insert(s[i][j]);
                e[n-j+i].push_back(s[i][j]);//排除一条对角线上相同的数,留下不同的数
            }
        }
    }
    int sum=0;
    q.clear();
    for(int i=1;i<=2*n-1;i++)
    {
        vis.clear();
        if(dfs(i))
            sum++;
    }
    if(sum!=2*n-1)
    {
        //cout<<"NO"<<endl;
        printf("NO\n");
    }
    else
    {
        printf("YES\n");
        for(int i=2*n-1;i>=1;i--)
        {
            if(i==1)
                printf("%d",ans[i]);
            else
                printf("%d ",ans[i]);
        }
        printf("\n");
    }
    return 0;
}
0
0
查看评论

二分图的基本概念+二分图的最大匹配问题(匈牙利算法)

今天学了二分图的最大匹配,其中的匈牙利算法。。哦不,其实远不止这个,还有后面的一系列KM、开花树啊什么的算法。反正又是一个异常懵逼的一天。。。 我觉得应该是上课前没有稍微预习一下这个算法是什么,了解个大概,导致上课总是老师讲到后面了,我却还在纠结前面的内容。。可以当作经验教训。  ...
  • x_y_q_
  • x_y_q_
  • 2016-07-15 20:05
  • 2849

二分图的最大匹配问题完整代码

二分图的最大匹配问题很多博客原理讲的已经很清楚了,贴出来几个链接: 二分图的最大匹配问题解决原理 二分图最大匹配原理 自己花了两天时间敲出来的代码,感觉成长了很多: #include using namespace std; int n, m;//n代表图的点数, m代表边数 i...
  • bbtl_ast
  • bbtl_ast
  • 2017-06-06 14:12
  • 661

二分图最大匹配例题

例题1:HDU 1083&&POJ 1469 Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...
  • u012294939
  • u012294939
  • 2015-02-12 15:32
  • 2579

二分图最大匹配(模板+题目)

定义和定理: 最大匹配数:最大匹配的匹配边的数目 最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择 最大独立数:选取最多的点,使任意所选两点均不相连 最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长可以为 0(即单个点)。 定理...
  • guhaiteng
  • guhaiteng
  • 2016-09-05 20:48
  • 1016

二分图的最大匹配、完美匹配和匈牙利算法

二分图的最大匹配、完美匹配和匈牙利算法 2013-08-01Algorithms二分图匹配, 图论, 算法 这篇文章讲无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect match...
  • pi9nc
  • pi9nc
  • 2013-09-20 15:38
  • 63688

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

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一回我们已经将所有有问题的相亲情况表剔除了,那么接下来要做的就是安排相亲了。因为过年时间并不是很长,所以姑姑希望能够尽可能在一天安排比较多的相亲。由于一个人同一天只能和一个人相亲,所以要从...
  • wang2534499
  • wang2534499
  • 2015-07-25 10:51
  • 487

详解二分图的最大匹配

一天一算法二分图的匹配算法——最大匹配基本概念:二分图本身的概念就不解释了。这里主要介绍一下增广路。也有人称它为交错路。之所以称它为交错路是因为在这条路径上,未匹配边和匹配边是交替出现的。之所以称它为增广路,是因为如果能找到这条路,就能够使得匹配数加一。事实上,他的名字就是增广路的性质的体现。我们把...
  • coder_yuanxl
  • coder_yuanxl
  • 2016-04-14 21:05
  • 558

二分图最大匹配 最大增广路径 递归法

<br />二分图的最大匹配<br />增广路径法 递归实现<br /> <br />//分别定义左右最大元素数量<br />#define Left_Max 101<br />#define Right_Max 30...
  • GoOnDrift
  • GoOnDrift
  • 2010-08-23 22:53
  • 1276

hihoCoder 1122 二分图最大匹配 最大流

题意 求二分图最大匹配 思路 没有用匈牙利算法,而是试了试要带去的两个最大流模板。。 就是加一个源点,一个汇点,源到二分图集合1的点加一个流量为1的边,集合1到集合2的边设置为流量1,集合2的点到汇点加入流量1的边 实现 模板1实现 #include <iostream> #includ...
  • luke2834
  • luke2834
  • 2015-12-07 20:39
  • 336

二分图最大匹配与其应用

部分定义 传递闭包一个图。如果图GG中点ii到点jj存在通路,那么在传递闭包中有边i−>ji->j 二分图一个图GG,可以将其所有点分成x,yx,y两个点集,同时所有边满足他的两个端点分别落在x,yx,y上,而不会落在同一个集合里。 匹配实际为原图GG一个边集,GG中任意点作边的端点至多...
  • jokerwyt
  • jokerwyt
  • 2016-05-07 10:22
  • 997
    个人资料
    • 访问:13883次
    • 积分:884
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条