精华内容
下载资源
问答
  • (lecture_12)二分匹配及其应用(lecture_12)二分匹配及其应用(lecture_12)二分匹配及其应用(lecture_12)二分匹配及其应用(lecture_12)二分匹配及其应用(lecture_12)二分匹配及其应用
  • (HDUACM2010版_13)二分匹配及其应用

    千次下载 热门讨论 2014-08-23 08:56:41
    杭电ACM课件2014版之(HDUACM2010版_13)二分匹配及其应用
  • HDU 1045 二分匹配

    千次阅读 2012-09-06 15:32:21
    //这题意思是给出一张图,图中'X'表示wall,'.'表示空地,可以放置blockhouse ...//二分匹配,别人都说水题,但我没看出它是二分图匹配 //看了别人的解题报告后还有点懵懵懂懂的 //这题是把原始图分别按行和列缩点
    //hdu 1045  Fire Net
    
    //这题意思是给出一张图,图中'X'表示wall,'.'表示空地,可以放置blockhouse
    //同一条直线上只能有一个blockhouse,除非有wall隔开,问在给出的图中
    //最多能放置多少个blockhouse
    
    //二分匹配,别人都说水题,但我没看出它是二分图匹配
    //看了别人的解题报告后还有点懵懵懂懂的
    
    //这题是把原始图分别按行和列缩点
    //建图:横竖分区。先看每一列,同一列相连的空地同时看成一个点,显然这
    //样的区域不能够同时放两个点。这些点作为二分图的X部。同理在对所有的
    //行用相同的方法缩点,作为Y部。
    
    //连边的条件是两个区域有相交部分(即'.'的地方)。最后求最大匹配就是答案。
    
    
    #include <stdio.h>
    #include <string.h>
    
    #define N 8
    
    int cnt_row, cnt_col;
    int row[N][N], col[N][N], r[N], c[N];
    char map[N][N];
    bool path[N][N], vis[N];
    
    int dfs(int rr)
    {
    	for(int i = 0; i < cnt_col; ++i)
    	{   //rr到i有路径 且 i没遍历过
    		if(path[rr][i] && vis[i] == false)
    		{
    			vis[i] = true;
    			if(c[i] == -1 || dfs(c[i]))//若 i 还没匹配过或 跟i
    			{   //匹配的点找到另一个相匹配的点(则i 就可以跟rr匹配)
    				c[i] = rr;
    				r[rr] = i;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    int maxmatch()
    {
    	int ans = 0;
    	memset(r, -1, sizeof(r));
    	memset(c, -1, sizeof(c));
    	for(int i = 0; i < cnt_row; ++i)
    	{
    		if(r[i] == -1)
    		{
    			memset(vis, false, sizeof(vis));
    			ans += dfs(i);
    		}
    	}
    	return ans;
    }
    
    int main()
    {
    	int n;
    	while(scanf("%d%*c", &n), n)
    	{
    		for(int i = 0; i < n; ++i)
    		{
    			for(int j = 0; j < n; ++j)
    				map[i][j] = getchar();
    			getchar();
    		}
    
    		memset(row, -1, sizeof(row));
    		memset(col, -1, sizeof(col));
    		cnt_row = cnt_col = 0;
    		for(int i = 0; i < n; ++i)
    		{
    			for(int j = 0; j < n; ++j)
    			{
    				if(map[i][j] == '.' && row[i][j] == -1)
    				{           //横向缩点
    					for(int k = j; map[i][k] == '.' && k < n; ++k)
    						row[i][k] = cnt_row;  //给相同的区域标记同一个数字
    					cnt_row++;
    				}
    
    
    				if(map[j][i] == '.' && col[j][i] == -1)
    				{           //纵向缩点
    					for(int k = j; map[k][i] == '.' && k < n; ++k)
    						col[k][i] = cnt_col;  //给相同的区域标记同一个数字
    					cnt_col++;
    				}
    			}
    		}
    
    		memset(path, false, sizeof(path));
    		for(int i = 0; i < n; ++i)
    			for(int j = 0; j < n; ++j)
    				if(map[i][j] == '.')    //连边,'.'的地方即为缩点后的 行和列的交点
    					path[ row[i][j] ][ col[i][j] ] = true;
    
    		printf("%d\n", maxmatch());  //二分图匹配
    	}
    	return 0;
    }

    展开全文
  • 二分匹配题集

    千次阅读 2013-04-13 08:45:11
    普通匹配,多重匹配 【HDU】 1068Girls and Boys 最大匹配★ 1150Machine Schedule 最小点覆盖★ 1151Air Raid 最小路径覆盖★ 1179Ollivanders 最大匹配★ 1281棋盘游戏 行列匹配+求关键点★★ ...
    普通匹配,多重匹配

    【HDU】
    1068 Girls and Boys 最大匹配★
    1150 Machine Schedule 最小点覆盖★
    1151 Air Raid 最小路径覆盖★
    1179 Ollivanders 最大匹配★
    1281 棋盘游戏 行列匹配+求关键点★★
    1498 50 years, 50 colors 行列匹配★
    1507 Uncle Tom's Inherited Land* 黑白染色+奇偶匹配(1X2的矩形覆盖)★
    1528 Card Game Cheater 最大匹配★
    1845 Jimmy’s Assignment 最大匹配(HK算法)★
    2063 过山车 最大匹配★
    2119 Matrix 行列匹配
    2444 The Accomodation of Students 并查集分集合+最大匹配(好题!)★★
    2768 Cat vs. Dog 最大独立集★★
    3360 National Treasures 黑白染色+最小点覆盖★★
    1045 Fire Net 行列匹配变形★★
    1350 Taxi Cab Scheme 最小路径覆盖★
    1960 Taxi Cab Scheme 最小路径覆盖★
    3118 Arbiter 二分匹配本质(好题!)★★★
    3729 I'm Telling the Truth最大匹配+输出字典序最大的匹配情况★★
    2389 Rain on your Parade 最大匹配(HK算法)★★
    1054 Strategic Game 最小点覆盖★
    2819 Swap 行列匹配+输出解★★
    1669  Jamie's Contact Groups 二分+多重匹配★★
    3605 Escape 多重匹配★
    3861 The King’s Problem 强连通+最小路径覆盖★★
    2236 无题II 二分+二分匹配★★
    1083 Courses 最大匹配★
    1526 A Plug for UNIX 最大匹配★
    2458 Kindergarten 行列匹配★
    4160 Dolls 最大匹配★
    4185 Oil Skimming 黑白匹配★
    2413 Against Mammoths 二分+二分匹配★★
    3468 Treasure Hunting 最短路+二分匹配★★★
    3517  Adopt or not 最大独立集★★★
    3026 Chinese Chess 二分匹配必须边★★★
    ===============================================================================================
    【POJ】
    1087 A Plug for UNIX
    1274  The Perfect Stall
    1469 COURSES
    1486  Sorting Slides 二分图的必须边
    1548 Robots
    1698 Alice's Chance
    1719 Shooting Contest
    2060  Taxi Cab Scheme 最小路径覆盖
    2112  Optimal Milking 二分+多重匹配
    2226  Muddy Fields 行列的覆盖
    2239  Selecting Courses
    2289  Jamie's Contact Groups 二分+多重匹配
    2446  Chessboard
    2536  Gopher II
    2584 T-Shirt Gumbo
    2594  Treasure Exploration 可相交最小路径覆盖
    2672 Hotkeys
    2724  Purifying Machine
    3020  Antenna Placement
    3041  Asteroids 简单行列匹配 
    3189 Steady Cow Assignment 二分+多重匹配
    3216  Repairing Company
    3343  Against Mammoths
    3692  Kindergarten
    poj2771 最大独立集
    展开全文
  • hdu 1068 Girls and Boys 二分匹配

    千次阅读 2012-06-19 02:11:34
    很标准的二分匹配,用的是匈牙利算法。   #include #include using namespace std; int key[1000][1000],total,count; //count是所有点能找到增广路径的 total是总人数 int ok[1000]; //记录右边所有的已经...

    很标准的二分匹配,用的是匈牙利算法。

     

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int key[1000][1000],total,count;   //count是所有点能找到增广路径的    total是总人数
    
    int ok[1000];      //记录右边所有的已经匹配的点,ok[i]=j右边第i个与左边第j个匹配
    int rightt[1000];    //记录在一次递归中,右边各点是否已经匹配
    
    int route(int );
    
    int main()
    {
        int a,b,c;
        string no;
        char m;
    
        while(cin>>total)
        {
            count=0;
    
            memset(key,0,sizeof(key));
    
            for(int i=0;i<total;i++)
            {
                cin>>a>>m>>m>>b>>m;
    
                for(int j=0;j<b;j++)
                {
                    scanf("%d",&c);
                    key[a][c]=1;
                }
            }
            memset(ok,-1,sizeof(ok));
    
            for(i=0;i<total;i++)          //每个点为起点,都找一次增广路径
            {
                memset(rightt,0,sizeof(rightt));
    
                if(route(i))
                    count++;
            }
    
            cout<<total-count/2<<endl;
        }
    
        return 0;
    }
    
    int route(int i)
    {
        for(int j=0;j<total;j++)
        {
            if(key[i][j]&&!rightt[j])       //j点在这次递归中,没有被访问过
            {
                rightt[j]=1;
                if(ok[j]==-1||route(ok[j]))
                {
                    ok[j]=i;
                    return 1;
                }
            }
        }
        return 0;
    }


     

    展开全文
  • 有向图的二分匹配

    千次阅读 2011-03-29 19:50:00
    ... 思路:这道题目要倒着想,假设 1 到 n 要放进柱子,最少要用几根柱子,二分匹配就是求柱子的数量的。其实可以当做是最小点覆盖= n - 最大匹配数,这道题目还有一个关键点,在

    http://info.zjfc.edu.cn/acm/problemDetail.aspx?pid=1483

     

    这道题目是在比赛的时候做的,数据应该不大,所以直接暴力模拟了,赛后听学长讲正解是二分图的匹配,百思不得其解,不知如何构图,于是他点拨了一下,恍然大悟呀,发现思维灵活是何其得重要。

    思路:这道题目要倒着想,假设 1 到 n 要放进柱子,最少要用几根柱子,二分匹配就是求柱子的数量的。其实可以当做是最小点覆盖= n - 最大匹配数,这道题目还有一个关键点,在标题中已经提到了,就是有向图,在放第 k 个球时,得保证 k-1 个已经放好了。所以再构图的时候需要注意。

     

    贴下代码:

    展开全文
  • 题意: 给定女孩人数,男孩人数,m个边 下面m条边 u-v 表示u女孩和v男孩相互认识 男孩们都认识每个男孩,女孩们都认识每个女孩 ...求其中最多有多少人 两两互相认识 ...二分匹配裸题: #include #i
  • HDU1281-棋盘游戏-二分匹配与增广链

    千次阅读 2011-12-28 15:43:32
    题目链接: ...   题目描述: 在一个N*M大小的棋盘中,有K个空位置,(1)在这些空位置上最多能放多少的“车”(一行或一列最多一个)。(2)空位置中,有的位置若不放“车”,...这题可以看成行与列的二分匹配问题,
  • POJ二分匹配总结_匈牙利算法

    千次阅读 2010-05-18 22:52:00
    二分匹配模板bool makepair(int t){ int i; for(i=1;i;i++) { if(path[t][i]==1 && visited[i]==0) //i号男还没被需要并且和t号女互相喜欢 { visited[i]=1; //被t号女需要 if(match[i]==-1
  • 二分匹配,每一个匹配表示2个坐标相连 2个坐标相连就是这2个坐标组成一个1*2的方格   把 能组成方格的2个坐标 建边 注意2维坐标1维化 i*M+j M>100 lef[x] = v 这个数组记录 匹配边 输出x v 就是答案
  • 关于二分匹配,涉及到了一些定理(Berge, Hall ,Konig, Tutte):这里主要论述定理1,因为它对匈牙利算法的证明 最有用。 定理1:(Berge 1957)M是最大匹配的充要条件是G中无M的可增广轨(关于增广轨可以...
  • 网络最大流与二分匹配之间的关系

    千次阅读 2014-04-01 00:49:59
    二分图有两部分节点L和R,各部分内部节点之间没有边,即每条边的两个节点都一定分属这两部分,二分图的一个匹配是找到这样一组边,使得每个节点都只有至多一条边与其相连。 而二分图求最大匹配可以用匈牙利算法来求...
  • hdu 2063(基础二分匹配

    千次阅读 2012-07-28 21:19:53
    (7)最后,也是最重要的一条,把增广路径上的所有第奇数条边加入到原匹配中去,并把增广路径中的所有第偶数条边从原匹配中删除(这个操作称为增广路径的截断),则新的匹配数就比原匹配数增加了1个。(如图2所示,新...
  • 前段时间为了省赛,我专门花了半个月来“专研”部图,目前对部图还是有一点点心得,... 开始我对部图一窍不通,于是就在网上找资料,认真看完了各种资料,有一种感触:关于最大匹配问题,网上写的是挺好的
  • 即,求G的最大二分匹配数,可以转换为G的最大流(需要把G的边全部设为 1,并且加超级源点和汇点)。 一个图G,如果不具有完美匹配,直观感受是:能找到任意的一个节点集合V,V的邻居节点的集合NV含有的...
  • 九野的博客,转载请注明出处: ... ...优化一:时间戳优化,用Time 优化匹配时初始化T数组,要把T数组改成 int 型, 注意 Time 和 T数组 初始化的位置不是每次二分匹配,而是 在最开始之前 详见: ...
  • 二分匹配,KM,支配集,独立集,还有2-SAT。 下面就暑假写过的一些题做一个小结。 (1)最短路的话一个主要掌握三个算法和两个优化。Dijsktra单源最短路,可以变形他的松弛条件,而产生很多的最短路变种,题型非常...
  • 部图,最大匹配

    千次阅读 2009-02-17 15:03:00
    合肥网赛有道题说是用二分匹配来做,于是决定好好看看二分匹配。荡了好久算是看明白了。帖子转自ycool什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,...
  • 多重匹配:一对多的二分图的多重匹配。二分图的多重匹配算法的实现类似于匈牙利算法,对于集合X中的元素xi,找到一个与其相连的元素yi后,检查匈牙利算法的两个条件是否成立,若yi未被匹配,则将 xi,yi匹配。否则,...
  • Java实现二分图的最大权匹配

    千次阅读 2019-07-26 17:46:00
    1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值...
  • PTA - 括号匹配()

    千次阅读 2019-05-05 10:21:11
    括号匹配 题目:检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。...若括号是匹配的,在第行打印YES,否则打印NO。 输入样例1: for(int i=0; i<v; i++){ visited[i] ...
  • java实现二分查找-两种方式

    万次阅读 多人点赞 2017-10-08 20:02:02
    二分查找是一种查询效率非常高的查找算法。又称折半查找。 起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法 二分查找算法...
  • 二分图的最佳匹配(KM 算法)

    千次阅读 2011-11-29 10:44:06
    KM算法求最小权二分匹配,模板题,构图很简单,直接把人当作左边的点,房子当作右边的点, 两者之间的曼哈顿距离当作权值即可。第一次搞带权二分匹配的题,就是用KM算法求最小权的时候要加个处,由于KM求的是最大权...
  • python与opencv图像处理基础总结,模板匹配匹配的原理和几种常用算法,python调用opencv相关API的方法,图像值化的处理,python调用opencv中的全局阈值函数和局部阈值函数,对图像图像阈值分割,实现图像值化...
  • 正则匹配

    千次阅读 2013-08-06 09:54:27
    正则匹配模式 匹配模式指得是正则表达式引擎将以何种模式匹配字符串。 模式名称 启用,禁用 缺省启用 说明 UNIX_LINES (?d)启用,(?-d)禁用 是 启用Unix行模式。 在此模式下,只有 '\n'被认为...
  • 二分搜索(查找)方法

    千次阅读 2017-04-26 08:49:10
    在讨论二分搜索方法前先说下顺序搜索:顺序搜索 将关键字key顺序地与数组中每个元素进行比较,这个过程一直持续下去,直至关键字与某个元素匹配,或者所有数组元素都已比较完毕。 int linearSearch(int list[],...
  • 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子字符串与字典中的词进行匹配,如果匹配成功则进行下一轮匹配,直到所有字符串处理完毕,否则将子字符串从末尾去除一个字,再...
  • 1、前两种都是属于模板匹配的方法,这些概念是在《数字图像处理高级应用》里的,其是移动匹配与向量匹配很像,只是移动匹配对灰度变换的鲁棒性不好。 这里说的移动匹配:就是把模板图像在原图像上进行移动,让后计算...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 496,649
精华内容 198,659
关键字:

二分匹配