/* 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 ; }