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

来源:互联网 发布:java 日志记录 编辑:程序博客网 时间:2024/05/17 22:26


/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------------------------------------------//Copyright (c) 2011 panyanyany All rights reserved.URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1498Name  : 1498 50 years, 50 colorsDate  : Friday, August 26, 2011Time Stage : 1 hoursResult:44994742011-08-26 21:00:07Accepted149815MS272K1856 BC++pyyTest 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 FALSE0#define TRUE1#define infinity    0x0f0f0f0f#define minus_inf    0x80808080#define MAXSIZE109int 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 ;}


原创粉丝点击