`
kenby
  • 浏览: 724650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poj 1469 匈牙利算法求最大匹配

阅读更多
#include <stdio.h>
#include <string.h>

#define DEBUG

#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__) 
#else
#define debug(...)
#endif

#define N 301

char	weight[101][N];	/* weight[x][y] = 1 表示学生x可以做课程y的助教 */
char	mat[N];		/* mat[y] = x,表示定点y和x匹配 */
char	visit[N];
int		nx, ny;

int find(int x)
{
	int		y;

	debug("go to X.%d\n", x);
	for (y = 1; y <= ny; y++) {
		if (!visit[y] && weight[x][y] > 0) {
			debug("go to Y.%d\n", y);
			visit[y] = 1;
			if (mat[y] == -1 || find(mat[y])) {
				debug("%d %d %d\n", x, y, mat[y]);
				/* 事实上程序实现的时候不用取反操作来标记哪些边已加入M,哪些边未加入M
				 * 因为由mat数组和visit数组就可以确定,若mat[y] != -1, 则(mat[y],y)必然是一条加入M的边
				 * 只要visit[y] = 0,则(x,y)必然是一条没有加入M的边
				if (mat[y] != -1) {
					weight[mat[y]][y] *= -1;
				}
				weight[x][y] *= -1;
				*/
				mat[y] = x;
				return 1;
			}
			debug("return from Y.%d\n", y);
		}
	}	
	return 0;
}

int main()
{
	int		t, m, x, y, possible;

	scanf("%d", &t);
	while (t--) {
		memset(weight, 0, sizeof(weight));
		memset(mat, -1, sizeof(mat));
		scanf("%d %d", &nx, &ny);	/* X集合是课程,Y集合是学生, 课程应比学生少 */
		for (x = 1; x <= nx; x++) {
			scanf("%d", &m);
			while (m--) {
				scanf("%d", &y);
				weight[x][y] = 1;
			}
		}
		if (nx > ny) { 
			printf("NO\n"); continue; 
		}
		possible = 1;
		for (x = 1; x <= nx; x++) {	
			memset(visit, 0, sizeof(visit));
			if (!find(x)) {	/* X集合只要有一个定点找不到增广路径,则图必然不是完备匹配 */
				possible = 0;
				break;
			}
			debug("got an augmenting path...\n");
		}
		if (possible) {
			printf("YES\n");
		}
		else {
			printf("NO\n");
		}
	}
	return 0;
}
分享到:
评论

相关推荐

    匈牙利算法模板以及应用

    匈牙利算法主要应用于寻找二分图中的最大匹配,即在这个图中找到最大的两两不相交的边的集合。 #### 二、关键概念 1. **二分图**:由两个互不相交的顶点集组成的图,图中的每条边都连接着这两个集合中的节点。 - ...

    POJ中级图算法所有题目【解题报告+AC代码】

    5. **二分图匹配**:匈牙利算法或Kuhn-Munkres算法用于求解二分图的最大匹配问题,广泛应用于配对问题。 6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际...

    ACM讲课之二分图匹配匈牙利算法学习教案.pptx

    匈牙利算法是解决无权二分图最大匹配问题的经典算法之一。该算法的核心思想是通过不断寻找所谓的“增广路径”来逐步扩大匹配集M的大小,直到无法再找到增广路径为止。 **关键概念:** - **盖点**:指那些被当前匹配...

    二分图匹配题解1

    在解决这些问题时,通常会使用匈牙利算法(Kuhn-Munkres算法)或者Hopcroft-Karp算法等高效算法。这些算法能够找到二分图中的最大匹配,有效地解决了资源分配问题。对于编程实现,链表常用于存储邻接表,以节省空间...

    poj训练计划.doc

    - 二分图的最大匹配:如匈牙利算法,用于解决二分图的匹配问题,如`poj3041, poj3020`。 - **数据结构** - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如...

    POJ题目简单分类(ACM)

    - **二分图最大匹配**:匈牙利算法,如poj3041和poj3020,解决分配问题。 - **最大流的增广路算法**:KM算法,如poj1459和poj3436,用于寻找网络中能传输的最大流量。 3. **数据结构**: - **字符串处理**:如...

    poj图论题目汇总

    - **匈牙利算法**:解决二分图匹配问题的一种经典算法。 #### 1094 Sorting It All Out - Floyd 或拓扑排序 - **知识点**: - **Floyd算法**:用于解决所有顶点对之间的最短路径问题。 - **拓扑排序**:对于有...

    acm训练计划(poj的题)

    - (poj1459, poj3436):例如匈牙利算法(KM算法),用于解决二分图的最大匹配问题。 ### 三、数据结构 1. **链表、栈、队列**: - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - ...

    acm新手刷题攻略之poj

    - 二分图匹配问题通常通过匈牙利算法(Hungarian Algorithm)来解决。 #### 三、数据结构 1. **堆** - 推荐题目:[poj1035](https://vjudge.net/problem/POJ-1035)、[poj3080]...

    ACM常用算法及其相应的练习题.docx

    * 二分图的最大匹配:匈牙利算法 + poj3041, poj3020 * 最大流的增广路算法:KM算法 + poj1459, poj3436 三、数据结构 * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单...

    强大的POJ分类——各类编程简单题及其算法分类

    5. **二分图的最大匹配**:使用匈牙利算法解决,如POJ3041和3020。 6. **最大流的增广路算法**:如KM算法,求解网络中的最大流量问题,如POJ1459和3436。 ### 数据结构 1. **串**:处理字符串的问题,如POJ1035、...

    poj题目分类

    5. 二分图最大匹配:匈牙利算法的应用,如POJ3041、POJ3020。 6. 最大流:Kuhn-Munkres算法,如POJ1459、POJ3436。 三、数据结构 1. 串:字符串处理,如POJ1035、POJ3080、POJ1936。 2. 排序:快速排序、归并排序、...

    POJ题目分类

    - **匈牙利算法**:一种高效的匹配算法,可以在多项式时间内找到一个二分图的最大匹配。 ### 三、数据结构 #### 1. 队列 - **内容**: 包括队列的基本操作如入队、出队等。 - **示例题目**: poj1035, poj3080, ...

    ACM常用算法及其相应的练习题 (2).docx

    (5) 二分图的最大匹配:匈牙利算法 (6) 最大流的增广路算法:KM算法 三、数据结构 本部分涵盖了数据结构,包括串、排序、简单并查集的应用、哈希表和二分查找等高效查找法、哈夫曼树和堆、trie树。 (1) 串:poj...

    最优匹配题解1

    然而,KM算法(Kuhn-Munkres算法,也称为匈牙利算法)在处理这类问题时通常具有更好的性能。它主要用于解决完全匹配问题,即每个元素都必须找到一个匹配的伙伴。在POJ2195和POJ3565题目中,KM算法都能够有效地找到最...

    算法训练方案详解

    - **定义**: 使用匈牙利算法找到二分图中最大的匹配集合。 - **应用场景**: 适用于配对问题。 - **示例题目**: POJ 3041, POJ 3020 - **注意事项**: 理解匈牙利算法的基本思想和实现过程。 **6. 最大流的增广路...

    KM匹配题集

    KM 最大时,要求改动最少**、**【HDU 3523】My Brute 求 KM 最大时,要求改动最少**:这些题目中的“KM”可能不是指KMP算法,而是指Kuhn-Munkres算法(也称匈牙利算法),用于解决赋权二分图的最大匹配问题,目标是在...

    ACM算法总结大全——超有用!

    5. 二分图的最大匹配:匈牙利算法解决分配问题,如poj3041、poj3020。 6. 增广路算法:KM算法用于求解最大流问题,如poj1459和poj3436。 三、数据结构 1. 串:处理字符串相关问题,如poj1035、poj3080和poj1936。 2...

    ACMer需要掌握的算法讲解.pdf

    5. 二分图的最大匹配:匈牙利算法,如POJ3041。 6. 最大流的增广路算法:KM算法,如POJ1459。 三、数据结构 1. 串:处理字符串的算法,如POJ1035。 2. 排序:快速排序、归并排序(涉及逆序数)和堆排序,如POJ2299...

    很快速的提高算法能力.docx

    - **二分图最大匹配**:学习匈牙利算法,如Poj3041、Poj3020。 - **最大流**:掌握KM算法,如Poj1459、Poj3436。 3. **数据结构** - **字符串**:学习字符串处理和操作,如Poj1035、Poj3080等。 - **排序**:...

Global site tag (gtag.js) - Google Analytics