杭电 hdu 1498 50 years, 50 colors (二分图,最大匹配)


/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.

URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1498
Name  : 1498 50 years, 50 colors

Date  : Friday, August 26, 2011
Time Stage : 1 hours

Result:
4499474	2011-08-26 21:00:07	Accepted	1498
15MS	272K	1856 B
C++	pyy


Test Data:


Review:

//----------------------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))

#define FALSE	0
#define TRUE	1

#define infinity    0x0f0f0f0f
#define minus_inf    0x80808080

#define MAXSIZE	109

int n, k ;
int cover[MAXSIZE], link[MAXSIZE], count[MAXSIZE], record[MAXSIZE] ;
int map[MAXSIZE][MAXSIZE] ;

int find (int cur, int color)
{
	int i ;
	for (i = 1 ; i <= n ; ++i)
		if (map[cur][i] == color && cover[i] == 0)	// 颜色要一致,且没有覆盖过
		{
			cover[i] = 1 ;							// 表示此次被覆盖
			if (link[i] == 0 || find (link[i], color))
			{
				link[i] = cur ;	// 形成了新的交替链
				return 1 ;
			}
		}
	return 0 ;
}

int getRes (int color)
{
	int i, sum ;
	sum = 0 ;
	memset (link, 0, sizeof (link)) ;			// 每一种颜色link 都要初始化
	for (i = 1 ; i <= n ; ++i)
	{
		memset (cover, 0, sizeof (cover)) ;
		sum += find (i, color) ;
	}
	return sum ;
}

int main ()
{
	int i, j, res, iRecord ;
	while (scanf ("%d%d", &n, &k), n | k)
	{
		iRecord = 0 ;
		memset (map, 0, sizeof (map)) ;			// 图表,记录气球分布
		memset (count, 0, sizeof (count)) ;		// 记数,记录各颜色的气球出现次数
		memset (record, 0, sizeof (record)) ;	// 记录,记录符合题意的气球
		for (i = 1 ; i <= n ; ++i)
			for (j = 1 ; j <= n ; ++j)
			{
				scanf ("%d", &map[i][j]) ;
				++count[map[i][j]] ;			// 记录各颜色气球的出现次数
			}

		for (i = 1 ; i <= 50 ; ++i)
			if (count[i] && getRes (i) > k)		// 如果i 颜色气球出现过,且打破所有
				record[iRecord++] = i ;			// i 的次数大于k 
		
		if (!iRecord)
			printf ("-1\n") ;
		else
		{
			for (i = 0 ; i < iRecord - 1 ; ++i)
				printf ("%d ", record[i]) ;
			printf ("%d\n", record[i]) ;
		}
	}
	return 0 ;
}


你可能感兴趣的:(ACM,HDU,pyy,二分图,最大匹配)