Skip to content

Instantly share code, notes, and snippets.

@sifue
Last active December 17, 2015 17:39
Show Gist options
  • Save sifue/5647804 to your computer and use it in GitHub Desktop.
Save sifue/5647804 to your computer and use it in GitHub Desktop.
食物連鎖 N匹の動物がいて、1,2,....,Nと番号がつけられています。動物はすべて3つの種類、A, B, Cのいずれかです。AはBを食べ、BはCを食べ、CはAを食べます。次の2種類の情報が番号にk個与えられます。 タイプ1 : xとyは同じ種類です。 タイプ2 : xはyを食べます。 これらは全て正しいとは限りません。以前に与えられた情報と矛盾する情報や、x, yが正しい番号(1, 2, ...., N)でないような正しくない情報が与えられる可能性があります。K個の情報のうち、そのような情報の個数を出力して下さい。そのような情報は捨てると考えます。 制約 1 ≦ N ≦ 50000 0 ≦ K ≦ 100000 入力 N = 100 K = 7 // 情報は次の7個 : (タイプ番…
import scala.collection.mutable
object FoodChain {
def main(args: Array[String]) {
/**
* 情報を定義する値オブジェクト
* @param infoType
* @param x
* @param y
*/
case class Info(infoType:Int, x: Int, y: Int)
// 与えられた情報を定義
// val maxNumber = 100
// val infoList = List(Info(1, 101, 1),Info(2, 1, 2),Info(2, 2, 3),Info(2, 3, 3),Info(1, 1, 3),Info(2, 3, 1),Info(1, 5, 5))
val maxNumber = 10000
val infoList = List(Info(1, 1682, 4043),Info(1, 2727, 6836),Info(2, 3855, 8064),Info(2, 9065, 892),Info(1, 5393, 3208),Info(2, 4246, 5230),Info(2, 6882, 7671),Info(1, 8442, 6315),Info(2, 8625, 8540),Info(1, 5481, 8332),Info(2, 1388, 3310),Info(1, 2287, 9686),Info(1, 7465, 3579),Info(2, 4427, 8311),Info(1, 6949, 5334),Info(2, 9431, 3818),Info(1, 7396, 3226),Info(1, 2935, 6675),Info(2, 9410, 3035),Info(2, 9310, 4586),Info(1, 1645, 6854),Info(1, 1549, 1164),Info(2, 7199, 9762),Info(1, 621, 6701),Info(2, 4567, 1541),Info(2, 7185, 993),Info(2, 7475, 4433),Info(2, 4142, 6395),Info(1, 3508, 1609),Info(1, 9086, 6375),Info(2, 3331, 7622),Info(2, 3937, 5486),Info(2, 1582, 3895),Info(1, 955, 8447),Info(1, 2441, 5588),Info(1, 2301, 4364),Info(1, 8933, 8266),Info(2, 1698, 277),Info(2, 9152, 2500),Info(1, 4977, 5686),Info(1, 128, 8492),Info(1, 3612, 4499),Info(2, 3566, 5605),Info(1, 2469, 8042),Info(1, 8958, 6665),Info(1, 3560, 8535),Info(2, 8225, 124),Info(1, 7906, 5656),Info(1, 822, 5509),Info(1, 4486, 1125),Info(1, 6198, 2281),Info(1, 4338, 5230),Info(1, 3056, 9441),Info(1, 3074, 5202),Info(1, 536, 9472),Info(1, 5062, 5623),Info(2, 478, 674),Info(1, 6467, 7522),Info(1, 8942, 7746),Info(2, 982, 2947),Info(1, 8647, 4178),Info(1, 1473, 2023),Info(2, 2223, 3462),Info(1, 8979, 9145),Info(2, 1377, 5432),Info(2, 9682, 863),Info(2, 5023, 4397),Info(2, 3659, 8013),Info(2, 388, 375),Info(1, 8751, 6754),Info(2, 6087, 6604),Info(1, 6471, 5644),Info(2, 7971, 4213),Info(2, 7744, 3583),Info(1, 6452, 6425),Info(1, 6155, 7036),Info(2, 3324, 6005),Info(1, 927, 9704),Info(1, 324, 6948),Info(2, 2150, 6435),Info(2, 4199, 1797),Info(2, 2220, 5939),Info(1, 1578, 9524),Info(1, 7925, 3070),Info(1, 2693, 8977),Info(1, 8376, 3722),Info(2, 9645, 7642),Info(1, 9489, 2186),Info(1, 3155, 1499),Info(2, 5825, 8468),Info(2, 9697, 6979),Info(2, 1365, 3019),Info(1, 4104, 2266),Info(2, 20, 9905),Info(1, 5279, 8221),Info(2, 8177, 6265),Info(1, 2409, 7641),Info(1, 4643, 6773),Info(2, 8651, 5274),Info(1, 9891, 1511),Info(2, 8316, 3739),Info(1, 7247, 9815),Info(1, 8490, 2799),Info(1, 4730, 4665),Info(2, 3699, 8440),Info(2, 779, 10008),Info(2, 7935, 8523),Info(1, 6749, 462),Info(2, 1286, 380),Info(2, 6056, 2813),Info(2, 7011, 7446),Info(1, 1075, 1774),Info(2, 7490, 739),Info(1, 7778, 135),Info(1, 5038, 236),Info(2, 1129, 3540),Info(2, 9218, 3728),Info(2, 4114, 2717),Info(1, 1815, 9113),Info(2, 2603, 8250),Info(1, 1734, 2951),Info(2, 6190, 6096),Info(1, 1041, 5301),Info(1, 5713, 4828),Info(2, 3485, 967),Info(1, 5303, 6298),Info(1, 4535, 4015),Info(1, 40, 5679),Info(1, 846, 6930),Info(2, 6781, 403),Info(2, 7730, 3573),Info(1, 4527, 3696),Info(1, 2221, 6710),Info(1, 4450, 4589),Info(1, 3513, 6602),Info(2, 6982, 8633),Info(2, 652, 6510),Info(1, 5700, 9550),Info(2, 374, 9401),Info(1, 9890, 3842),Info(1, 3016, 215),Info(1, 8370, 3766),Info(2, 2036, 4527),Info(2, 2807, 9120),Info(1, 8450, 9933),Info(2, 6256, 1852),Info(2, 1212, 4707),Info(2, 6479, 6620),Info(1, 9324, 5632),Info(1, 9737, 5459),Info(1, 4247, 8682),Info(1, 3923, 9590),Info(2, 9093, 7247),Info(1, 3992, 443),Info(1, 8005, 5165),Info(2, 9562, 9916),Info(2, 6109, 1005),Info(2, 9279, 10052),Info(1, 3129, 3554),Info(1, 7592, 9464),Info(2, 231, 8711),Info(1, 5265, 1779),Info(1, 1586, 7859),Info(1, 4818, 7718),Info(2, 2728, 1982),Info(2, 8665, 7992),Info(1, 4376, 4615),Info(2, 1400, 2387),Info(1, 6947, 8898),Info(1, 2435, 8297),Info(2, 1923, 3775),Info(2, 8131, 231),Info(2, 7933, 5096),Info(1, 812, 3367),Info(1, 6815, 666),Info(1, 3230, 9181),Info(1, 6187, 980),Info(2, 3816, 5514),Info(2, 1076, 5616),Info(2, 3495, 9235),Info(2, 9187, 2233),Info(2, 4621, 2860),Info(1, 5557, 8438),Info(1, 6188, 8529),Info(1, 3092, 1226),Info(1, 2846, 1637),Info(2, 5011, 8601),Info(2, 2753, 742),Info(2, 8349, 7512),Info(1, 3990, 7087),Info(2, 4384, 10030),Info(1, 9575, 592),Info(1, 1000, 1387),Info(2, 7741, 4901),Info(2, 8273, 739),Info(1, 7851, 4184),Info(1, 9858, 5463),Info(1, 6953, 5410),Info(1, 2863, 9046),Info(2, 6286, 929),Info(1, 8620, 2979),Info(1, 667, 3372),Info(2, 9109, 5417),Info(1, 1625, 6367),Info(2, 3094, 8235),Info(1, 7861, 7452),Info(1, 3359, 5111),Info(1, 4894, 487),Info(2, 9305, 3848),Info(1, 9264, 2891),Info(1, 2733, 9545),Info(1, 2059, 838),Info(2, 3529, 9595),Info(1, 1923, 8647),Info(2, 6866, 9823),Info(1, 5748, 3047),Info(1, 8767, 1458),Info(1, 780, 1571),Info(1, 2426, 6364),Info(2, 8702, 6115),Info(1, 6108, 2341),Info(1, 1211, 9394),Info(2, 5210, 3568),Info(2, 3915, 8892),Info(1, 3943, 6841),Info(2, 9829, 1502),Info(1, 1120, 2275),Info(2, 3305, 1148),Info(1, 4872, 6126),Info(2, 2714, 8017),Info(2, 1670, 6168),Info(1, 9971, 3503),Info(2, 6308, 1901),Info(2, 3736, 9050),Info(1, 7772, 4136),Info(2, 410, 8978),Info(2, 6234, 552),Info(1, 9963, 2686),Info(1, 9141, 9198),Info(1, 2013, 6936),Info(1, 8698, 4581),Info(1, 3162, 2572),Info(2, 9208, 7581),Info(1, 3900, 6694),Info(1, 1461, 2946),Info(1, 7956, 2404),Info(2, 6585, 6218),Info(1, 3612, 6438),Info(1, 1954, 8483),Info(1, 1471, 8789),Info(1, 1027, 3950),Info(1, 6279, 1579),Info(2, 3588, 9350),Info(2, 612, 4690),Info(2, 7338, 6514),Info(2, 7898, 1998),Info(1, 3620, 5325),Info(1, 5601, 2404),Info(1, 5391, 5898),Info(1, 6323, 5611),Info(2, 4040, 6139),Info(2, 8537, 6273),Info(2, 4972, 7064),Info(1, 6659, 497),Info(1, 4256, 5736),Info(1, 9816, 2017),Info(1, 8472, 8115),Info(2, 659, 2390),Info(2, 1703, 3798),Info(1, 6447, 8399),Info(1, 9323, 7322),Info(1, 1276, 4146),Info(2, 2920, 7119),Info(2, 1366, 1623),Info(1, 5263, 4439),Info(2, 809, 8003),Info(2, 7712, 3019),Info(1, 3660, 1866),Info(2, 661, 6),Info(2, 4541, 1218),Info(1, 1311, 5328),Info(1, 6556, 6463),Info(2, 6556, 2905),Info(1, 9606, 8687),Info(2, 9635, 8),Info(2, 6568, 7633),Info(1, 819, 9418),Info(1, 7726, 6457),Info(1, 3331, 8701),Info(1, 5310, 1997),Info(2, 287, 6185),Info(1, 6452, 6221),Info(1, 8790, 7603),Info(1, 6008, 8281),Info(1, 1053, 1222),Info(1, 8019, 50),Info(2, 4029, 380),Info(1, 424, 1287),Info(2, 110, 7093),Info(2, 7904, 4150),Info(1, 8978, 8841),Info(2, 1025, 7786),Info(2, 9467, 4496),Info(2, 908, 7300),Info(2, 1031, 2191),Info(2, 1940, 457),Info(1, 7343, 3079),Info(1, 9335, 1631),Info(1, 1793, 8670),Info(1, 2142, 6854),Info(1, 6044, 5684),Info(2, 8372, 1294),Info(2, 1148, 218),Info(1, 1351, 4041),Info(1, 31, 131),Info(2, 9882, 1985),Info(2, 8146, 10076),Info(2, 1595, 3062),Info(2, 5750, 9385),Info(1, 7851, 8438),Info(1, 716, 4242),Info(1, 1950, 8499),Info(1, 609, 9107),Info(2, 6198, 6538),Info(2, 563, 7063),Info(1, 8209, 7843),Info(1, 56, 2567),Info(2, 8148, 119),Info(1, 7244, 9300),Info(1, 1629, 4533),Info(1, 8025, 2537),Info(1, 6939, 7698),Info(2, 2691, 9896),Info(2, 3316, 7647),Info(1, 8403, 8438),Info(1, 7986, 7130),Info(2, 5272, 8068),Info(1, 1467, 9207),Info(1, 149, 7641),Info(1, 7974, 2283),Info(2, 8272, 8435),Info(2, 8469, 2249),Info(1, 9968, 8429),Info(1, 6173, 7892),Info(2, 2841, 6597),Info(1, 6591, 2824),Info(2, 8795, 5780),Info(2, 10042, 4781),Info(2, 3556, 5160),Info(1, 6781, 3034),Info(1, 5909, 3528),Info(2, 9708, 3897),Info(1, 350, 3918),Info(1, 3264, 9039),Info(2, 8494, 870),Info(1, 2775, 6030),Info(1, 125, 9333),Info(2, 7648, 2850),Info(2, 3681, 9031),Info(1, 1819, 4156),Info(2, 8496, 3189),Info(1, 6744, 6116),Info(2, 6031, 3645),Info(1, 6643, 4681),Info(2, 3310, 175),Info(1, 2, 3338),Info(2, 6685, 6626),Info(1, 5396, 144),Info(2, 5115, 8143),Info(1, 8149, 5342),Info(1, 9483, 6241),Info(2, 664, 2733),Info(2, 1849, 2737),Info(2, 7767, 7311),Info(1, 8394, 5792),Info(2, 2590, 722),Info(1, 2894, 5850),Info(1, 3791, 2277),Info(1, 429, 7392),Info(1, 3319, 4068),Info(2, 2275, 2219),Info(2, 4514, 6646),Info(1, 8525, 8565),Info(2, 7896, 3168),Info(2, 8730, 8111),Info(2, 3852, 3396),Info(1, 4890, 960),Info(2, 5381, 1993),Info(2, 2478, 5676),Info(2, 5172, 6224),Info(2, 6961, 2931),Info(1, 9443, 4731),Info(1, 3377, 5611),Info(2, 4066, 4018),Info(1, 7935, 8269),Info(1, 7901, 7178),Info(2, 3072, 1690),Info(2, 3332, 6260),Info(2, 5968, 6320),Info(2, 7025, 7083),Info(1, 3986, 8656),Info(2, 6608, 4230),Info(2, 4246, 5204),Info(1, 5466, 7772),Info(1, 5794, 2857),Info(2, 36, 2337),Info(1, 2279, 3256),Info(1, 9916, 438),Info(2, 2350, 5249),Info(2, 8216, 6034),Info(2, 1012, 8266),Info(2, 6059, 9952),Info(1, 4274, 5658),Info(2, 7258, 9225),Info(1, 80, 5509),Info(1, 6539, 640),Info(1, 1873, 5476),Info(2, 7887, 7978),Info(1, 8229, 1487),Info(1, 3709, 8690),Info(2, 3723, 7794),Info(1, 5888, 8694),Info(1, 7991, 1328),Info(2, 3, 3874),Info(2, 1079, 9500),Info(2, 8555, 9595),Info(2, 9132, 1386),Info(2, 5274, 8838),Info(2, 6674, 5692),Info(1, 6152, 8602),Info(1, 4080, 8139),Info(1, 3702, 542),Info(2, 2804, 984),Info(1, 1000, 5973),Info(2, 2395, 3902),Info(1, 9178, 265),Info(1, 357, 8240),Info(1, 172, 3245),Info(1, 3963, 7790),Info(1, 6722, 505),Info(1, 4998, 7480),Info(1, 4697, 984),Info(1, 5555, 173),Info(1, 3630, 4691),Info(2, 8312, 3462),Info(2, 6680, 1679),Info(1, 4545, 7657),Info(1, 2928, 9178),Info(2, 1134, 1446),Info(2, 4776, 5874),Info(1, 2551, 8190),Info(2, 10093, 3195),Info(2, 5966, 1623),Info(1, 8220, 1730),Info(1, 4557, 127),Info(2, 9689, 5004),Info(2, 5955, 609),Info(1, 9675, 439),Info(2, 9675, 5533),Info(1, 4797, 4291),Info(2, 3608, 9539),Info(1, 382, 5264),Info(2, 8603, 719),Info(2, 5865, 3571),Info(1, 85, 6417),Info(2, 1804, 9762),Info(1, 948, 6152),Info(2, 9591, 7333),Info(2, 4885, 5276),Info(1, 1248, 5753),Info(2, 4305, 6891),Info(1, 1771, 6616),Info(1, 4767, 9945),Info(2, 5552, 429),Info(1, 4430, 2088),Info(1, 7711, 9976),Info(1, 1604, 978),Info(1, 1412, 4302),Info(1, 7086, 5027),Info(2, 5269, 1),Info(2, 4223, 9643),Info(2, 5515, 1755),Info(2, 9663, 7078),Info(1, 9786, 3062),Info(1, 551, 1176),Info(2, 2412, 7424),Info(2, 9935, 8132),Info(1, 9805, 6724),Info(2, 332, 6239),Info(1, 6164, 5238),Info(1, 3178, 4906),Info(1, 778, 8494),Info(1, 2923, 4894),Info(2, 2790, 1147),Info(1, 2915, 249),Info(2, 6088, 2618),Info(1, 4081, 9601),Info(2, 6282, 8920),Info(1, 6318, 2022),Info(1, 234, 4571),Info(2, 1340, 4922),Info(2, 4330, 1561),Info(1, 4997, 8616),Info(2, 5703, 1673),Info(2, 6227, 5830),Info(1, 9863, 1029),Info(1, 3251, 4501),Info(2, 549, 5777),Info(1, 2194, 878),Info(2, 1500, 40),Info(1, 1801, 3349),Info(1, 7219, 1346),Info(1, 48, 490),Info(2, 9580, 665),Info(1, 4806, 7985),Info(1, 5538, 1878),Info(2, 6429, 4395),Info(1, 4392, 3857),Info(1, 7712, 4166),Info(2, 3496, 219),Info(1, 2083, 3421),Info(2, 131, 9848),Info(1, 6156, 10047),Info(2, 9656, 3810),Info(2, 7584, 7542),Info(2, 6689, 68),Info(2, 196, 277),Info(1, 3089, 5143),Info(1, 9838, 1582),Info(2, 8454, 9612),Info(1, 9331, 9717),Info(2, 1870, 5695),Info(1, 1860, 4702),Info(1, 6238, 2344),Info(2, 5957, 1692),Info(1, 8994, 8432),Info(2, 5561, 2252),Info(1, 5446, 6116),Info(1, 10091, 7447),Info(1, 9847, 5945),Info(2, 4487, 7949),Info(1, 6150, 10034),Info(1, 8672, 6733),Info(1, 5283, 2468),Info(1, 1037, 3274),Info(2, 3517, 768),Info(1, 5853, 7999),Info(2, 2717, 2574),Info(2, 1823, 24),Info(1, 7592, 3702),Info(1, 4982, 9368),Info(1, 6806, 4141),Info(2, 6928, 1358),Info(1, 9367, 2286),Info(1, 9868, 4995),Info(2, 6651, 8459),Info(2, 4745, 9861),Info(1, 2944, 458),Info(2, 8297, 852),Info(1, 758, 1426),Info(1, 10036, 4929),Info(2, 2229, 8336),Info(2, 5648, 2023),Info(1, 7882, 5612),Info(1, 7911, 7813),Info(2, 4106, 8952),Info(2, 5318, 9792),Info(1, 715, 6197),Info(1, 5068, 3991),Info(2, 3464, 9520),Info(2, 6557, 3173),Info(1, 3617, 7706),Info(2, 7671, 807),Info(2, 2862, 9254),Info(1, 2477, 9046),Info(2, 9244, 8065),Info(1, 7679, 3424),Info(2, 6900, 340),Info(1, 6737, 1865),Info(1, 144, 8535),Info(1, 9654, 1721),Info(2, 481, 10068),Info(2, 4043, 2409),Info(2, 9726, 513),Info(2, 1006, 5607),Info(1, 7454, 4188),Info(1, 4103, 627),Info(2, 9692, 6710),Info(1, 1357, 3840),Info(2, 2751, 9122),Info(2, 2137, 2930),Info(2, 5981, 1422),Info(1, 2510, 7906),Info(2, 432, 4020),Info(2, 1787, 2477),Info(2, 5632, 6673),Info(2, 5126, 5845),Info(2, 5494, 8267),Info(1, 5289, 7417),Info(1, 9412, 8150),Info(1, 5301, 8478),Info(1, 5349, 9010),Info(1, 7610, 9858),Info(2, 4984, 5548),Info(1, 3639, 7080),Info(1, 7828, 6223),Info(2, 3335, 9190),Info(2, 87, 1757),Info(1, 5658, 4852),Info(2, 1127, 4311),Info(1, 6087, 4056),Info(2, 2433, 1132),Info(1, 8477, 1835),Info(1, 2129, 3241),Info(2, 2257, 4312),Info(2, 5647, 880),Info(1, 420, 1311),Info(1, 7973, 1628),Info(2, 4184, 4309),Info(1, 9973, 2179),Info(2, 865, 5649),Info(1, 8898, 5773),Info(2, 6980, 4816),Info(1, 2818, 6793),Info(1, 4475, 8190),Info(2, 1903, 5239),Info(1, 3683, 8146),Info(2, 9061, 40),Info(1, 7182, 2278),Info(2, 5539, 8293),Info(2, 9196, 8971),Info(2, 7204, 2626),Info(2, 6879, 5613),Info(2, 5680, 1044),Info(2, 6660, 5473),Info(2, 4217, 6947),Info(1, 4486, 5576),Info(1, 9924, 1594),Info(1, 4571, 2058),Info(2, 3015, 2583),Info(1, 5980, 4498),Info(2, 4579, 3583),Info(2, 2107, 1938),Info(1, 2769, 2825),Info(2, 9764, 8600),Info(2, 5126, 5912),Info(1, 1010, 8712),Info(2, 6410, 9773),Info(2, 5458, 8950),Info(1, 10078, 8107),Info(1, 7674, 8221),Info(1, 2956, 8310),Info(2, 2005, 9413),Info(1, 4634, 9404),Info(2, 478, 7870),Info(1, 429, 5857),Info(2, 3142, 2820),Info(2, 9114, 4819),Info(1, 5830, 8708),Info(1, 9485, 1460),Info(1, 7664, 2992),Info(2, 909, 3399),Info(2, 2689, 7341),Info(2, 2463, 7795),Info(2, 661, 7304),Info(1, 9420, 2884),Info(2, 1077, 10093),Info(2, 3541, 5224),Info(1, 3839, 2724),Info(2, 9567, 6109),Info(1, 7152, 4799),Info(1, 7947, 2350),Info(2, 7503, 5278),Info(1, 747, 1396),Info(1, 930, 6054),Info(2, 399, 7548),Info(1, 2101, 9249),Info(2, 388, 557),Info(1, 8984, 2627),Info(2, 6626, 298),Info(2, 534, 1227),Info(1, 4637, 7807),Info(1, 5543, 8341),Info(1, 4529, 6456),Info(2, 1357, 6187),Info(1, 5930, 9799),Info(2, 7826, 1252),Info(1, 1230, 2631),Info(2, 2976, 6189),Info(1, 6116, 3933),Info(1, 9149, 2632),Info(2, 7821, 1460),Info(2, 8820, 3032),Info(2, 2867, 3696),Info(1, 1990, 8947),Info(1, 3469, 6693),Info(1, 3850, 6499),Info(1, 6136, 9985),Info(1, 7961, 2997),Info(1, 933, 6805),Info(2, 3947, 10020),Info(1, 4834, 3938),Info(1, 9299, 529),Info(1, 4628, 461),Info(2, 1176, 517),Info(1, 8879, 4216),Info(1, 8655, 6797),Info(1, 8186, 8999),Info(2, 242, 2836),Info(1, 5358, 7215),Info(2, 377, 9938),Info(1, 8672, 9745),Info(2, 8533, 6298),Info(1, 4984, 128),Info(1, 7110, 6796),Info(2, 928, 8304),Info(2, 2051, 5999),Info(2, 8515, 6382),Info(1, 8388, 5754),Info(1, 9083, 9095),Info(1, 232, 9864),Info(1, 4240, 6698),Info(1, 6380, 4023),Info(2, 4378, 9454),Info(2, 6620, 1146),Info(2, 9424, 3852),Info(1, 302, 3512),Info(1, 1719, 8218),Info(2, 7884, 8462),Info(1, 2437, 2773),Info(2, 3347, 4096),Info(1, 9283, 4252),Info(2, 2875, 919),Info(1, 987, 2877),Info(2, 5423, 6295),Info(1, 5617, 6001),Info(1, 6142, 1723),Info(1, 9117, 7233),Info(1, 10067, 3202),Info(1, 6707, 6250),Info(2, 3382, 6735),Info(1, 885, 9336),Info(2, 8052, 5235),Info(2, 2612, 1573),Info(1, 3220, 6692),Info(2, 3880, 10068),Info(1, 9069, 4661),Info(1, 491, 1465),Info(2, 6854, 2863),Info(1, 6423, 1107),Info(2, 388, 3767),Info(1, 6424, 4190),Info(2, 2908, 4000),Info(2, 1080, 2414),Info(1, 1272, 9987),Info(2, 2894, 8821),Info(1, 3992, 6720),Info(1, 7888, 2432),Info(2, 3947, 797),Info(1, 5748, 2252),Info(2, 3911, 7326),Info(2, 6139, 8929),Info(1, 9198, 2269),Info(1, 1678, 5110),Info(2, 7847, 2511),Info(1, 2667, 8325),Info(2, 3668, 9433),Info(1, 251, 3397),Info(1, 2398, 1671),Info(2, 2107, 6125),Info(1, 8583, 8334),Info(2, 1685, 2065),Info(1, 50, 3902),Info(1, 7174, 7894),Info(2, 7161, 1816),Info(1, 2337, 9391),Info(2, 3641, 1320),Info(2, 7266, 7471),Info(2, 2019, 9157),Info(1, 2223, 9564),Info(1, 1226, 5076),Info(2, 7804, 9997),Info(1, 5912, 4490),Info(2, 5602, 7662),Info(1, 6301, 9147),Info(1, 1228, 1360),Info(1, 6555, 1846),Info(1, 7694, 4704),Info(2, 7681, 8003),Info(2, 6271, 2717),Info(2, 1937, 4783),Info(1, 4841, 4184),Info(2, 9203, 1956),Info(2, 10089, 5973),Info(1, 5436, 6151),Info(2, 5269, 4091),Info(2, 9466, 7709),Info(2, 1674, 7679),Info(1, 3510, 9977),Info(2, 3567, 8559),Info(1, 7924, 3103),Info(2, 8701, 5169),Info(1, 2728, 3250),Info(2, 7924, 2003),Info(1, 7424, 1657),Info(1, 9315, 1078),Info(2, 6173, 5846),Info(2, 4080, 7202),Info(1, 1619, 91),Info(2, 8036, 5595),Info(1, 4286, 5252),Info(2, 4677, 3163),Info(2, 3885, 1918),Info(2, 4351, 9784),Info(1, 9508, 369),Info(2, 7982, 9230),Info(1, 5186, 5278),Info(1, 5263, 1470),Info(1, 547, 2703),Info(1, 174, 1232),Info(1, 4201, 1217),Info(1, 6452, 6500),Info(1, 5334, 7801),Info(1, 4157, 3178),Info(1, 426, 9872),Info(1, 515, 6920),Info(2, 7340, 3161),Info(1, 8646, 6806),Info(1, 7006, 9199),Info(2, 1080, 4533),Info(1, 8097, 4922),Info(1, 9913, 7806),Info(2, 5579, 9873),Info(2, 6511, 4763),Info(2, 5270, 5333),Info(1, 8890, 3449),Info(2, 4027, 8663),Info(2, 5183, 5548),Info(1, 9713, 8600),Info(2, 2406, 5638),Info(2, 8539, 2444),Info(2, 3709, 6848),Info(1, 7031, 2812),Info(2, 1192, 1698),Info(2, 9333, 6976),Info(1, 9235, 10084),Info(2, 4234, 9299),Info(1, 9851, 993),Info(2, 7497, 2917),Info(1, 6664, 3341),Info(2, 8735, 8596),Info(2, 3737, 3367),Info(2, 6311, 2669),Info(2, 8208, 4854),Info(1, 1643, 4540),Info(1, 3442, 8526),Info(2, 4744, 3298),Info(1, 6, 3080),Info(2, 586, 7829),Info(2, 3464, 7896),Info(2, 981, 3849),Info(1, 3846, 1141),Info(2, 2944, 2503),Info(1, 1871, 7689),Info(2, 4103, 7172),Info(1, 1762, 477),Info(1, 3398, 999),Info(2, 6468, 1280),Info(2, 2407, 5340),Info(2, 6396, 4620),Info(2, 840, 1433),Info(1, 9477, 4836),Info(1, 2255, 8116),Info(2, 5240, 1583),Info(2, 2256, 3532),Info(2, 4797, 4166),Info(1, 2588, 764),Info(2, 9144, 2223),Info(1, 883, 1065),Info(1, 4305, 7604),Info(2, 4719, 10027),Info(1, 415, 289),Info(1, 9225, 78),Info(2, 6138, 5535),Info(2, 3118, 5648),Info(1, 4217, 1379),Info(1, 7558, 7223),Info(1, 3768, 5766),Info(1, 2711, 6324),Info(1, 3258, 1366),Info(2, 7265, 10062),Info(1, 787, 4294),Info(2, 8633, 114),Info(2, 5549, 6462),Info(2, 973, 4372),Info(2, 4916, 9148),Info(2, 7364, 2687),Info(1, 278, 6573),Info(2, 6237, 729),Info(1, 7052, 6973),Info(2, 7284, 8943),Info(1, 2212, 7898),Info(2, 8105, 4230),Info(2, 1245, 8402),Info(1, 6092, 5565),Info(2, 6926, 2213),Info(2, 6390, 4895),Info(1, 198, 9799),Info(1, 8448, 4124),Info(2, 8861, 3538),Info(1, 23, 6665),Info(2, 5401, 7211),Info(1, 2602, 8017),Info(1, 3896, 800),Info(1, 10029, 7706),Info(1, 356, 5176),Info(1, 9493, 7855),Info(2, 5898, 7129),Info(2, 1477, 8537),Info(1, 6982, 4389),Info(1, 1347, 4191),Info(2, 5873, 815),Info(2, 6577, 7281),Info(2, 6959, 1292),Info(1, 8512, 6450),Info(1, 6543, 1499),Info(1, 7952, 5464),Info(1, 8907, 1802),Info(1, 9179, 1838),Info(2, 3515, 4941),Info(1, 8674, 664),Info(2, 8629, 3942),Info(2, 3539, 6383),Info(1, 4973, 9311),Info(1, 4263, 3274),Info(2, 6037, 3949),Info(1, 1441, 8807),Info(2, 4272, 8465),Info(1, 1312, 7466),Info(2, 4721, 2378),Info(1, 7058, 7740),Info(2, 9792, 7807),Info(1, 980, 4101),Info(1, 4150, 2784),Info(1, 1187, 796),Info(2, 4603, 8667),Info(2, 2161, 9839),Info(2, 4023, 6765),Info(2, 4454, 3521),Info(1, 8613, 7988),Info(2, 8305, 6554),Info(1, 4252, 6436),Info(2, 8157, 975),Info(2, 4716, 325),Info(1, 2401, 1926),Info(2, 5501, 9415),Info(2, 7704, 863),Info(2, 9368, 6213),Info(1, 129, 8725),Info(1, 7801, 3290),Info(1, 8231, 45),Info(2, 9418, 159),Info(2, 4917, 2637),Info(1, 3836, 6874),Info(2, 4753, 2927),Info(1, 1336, 6861),Info(2, 9506, 9708),Info(2, 2398, 4487),Info(2, 6977, 8939),Info(2, 8490, 6706),Info(2, 951, 801),Info(2, 4446, 96),Info(1, 6547, 4944),Info(2, 6802, 2771),Info(2, 7207, 4437),Info(2, 3969, 7026),Info(1, 2883, 1773),Info(2, 7037, 3954),Info(1, 3071, 3246),Info(2, 2996, 7653),Info(1, 2654, 9097),Info(1, 8385, 5697),Info(1, 4520, 9465),Info(2, 2979, 7365),Info(1, 1480, 743),Info(2, 7741, 3679),Info(2, 3213, 3874),Info(2, 5098, 9083),Info(1, 205, 5164),Info(2, 3401, 4168),Info(2, 911, 567),Info(2, 5626, 7793),Info(2, 2805, 3472),Info(2, 8634, 9249),Info(1, 5489, 9816),Info(1, 2817, 8979),Info(1, 3290, 9918),Info(2, 3902, 8521),Info(2, 5349, 4388),Info(2, 6431, 5777))
/**
* 動物の種類をA,B,Cの3種類定義
* AはBを食べ、BはCを食べ、CはAを食べる
*/
sealed abstract class AnimalType
object A extends AnimalType
object B extends AnimalType
object C extends AnimalType
val animalTypes = Seq(A, B, C)
/**
* 各順番の動物の種類の候補を定義する値オブジェクト
* @param number
* @param animalType
*/
case class Candidate(number:Int, animalType:AnimalType)
val doubtSet = mutable.Set[Info]()
val ufTree = new UnionFindSet[Candidate]
infoList.foreach { i => i match {
case Info(n, x, y) if x > maxNumber || y > maxNumber || x < 1 || y < 1 => doubtSet += i
case Info(1, x, y) =>
// xとyが同じという情報は、xのAとyのBが同じだったり、xのAとyのCが同じだったりしたら嘘
if(ufTree.same(Candidate(x, A), Candidate(y, B))
|| ufTree.same(Candidate(x, A), Candidate(y, C))) {
doubtSet += i
} else {
// 3種類の候補を同じグループとして統合
animalTypes.foreach(t => ufTree.union(Candidate(x, t), Candidate(y, t)))
}
case Info(2, x, y) =>
// xはyを食べるという情報は、 xのAとyのAが同じだったり、xのAとyのCが同じだったりしたら嘘
if(ufTree.same(Candidate(x, A), Candidate(y, A))
|| ufTree.same(Candidate(x, A), Candidate(y, C))) {
doubtSet += i
} else {
// 食べる情報が正しいするならば以下の3つ関係性候補を統合
ufTree.union(Candidate(x, A), Candidate(y, B))
ufTree.union(Candidate(x, B), Candidate(y, C))
ufTree.union(Candidate(x, C), Candidate(y, A))
}
}}
println(" failSet.size = " + doubtSet.size)
println(" failSet = " + doubtSet)
}
}
// https://github.com/xerial/silk/blob/4f06b307c0a873b529446cc3ca6b1fa261f985d0/src/main/scala/xerial/silk/util/UnionFindSet.scala
// add same() method
/*
* Copyright 2012 Taro L. Saito
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//--------------------------------------
//
// UnionFind.scala
// Since: 2012/04/05 15:03
//
//--------------------------------------
/**
* Union-find based disjoint set implementation.
*
* Reference: http://enwikipeida.org/wiki/Disjoint-set_data_structure
*
* @author leo
*
*/
class UnionFindSet[E] extends collection.mutable.Set[E] {
/**
* Holder of the element with its rank and the parent node
* @param elem
* @param parent
* @param rank
*/
private class Container(val elem: E, var parent: E, var rank: Int) {
def isRoot : Boolean = elem == parent
}
/**
* Hold a map from elements to their containers
*/
private val elemToContainerIndex = collection.mutable.Map[E, Container]()
/**
* Retrieve the container of the element e
* @param e
* @return container of e
*/
private def containerOf(e: E): Container = {
def newContainer = new Container(e, e, 0) // Set the parent to this element
// If no container for e is found, create a new one
elemToContainerIndex.getOrElseUpdate(e, newContainer)
}
/**
* Add a new element
* @param e
*/
def +=(e: E): this.type = {
containerOf(e) // create a new containerOf for e if it does not exist
this
}
def -=(e: E): this.type = {
throw new UnsupportedOperationException("removal")
}
/**
* Find the representative (root) element of the class to which e belongs
* @param e
* @return
*/
def find(e: E) : E = {
val c = containerOf(e)
if(c.isRoot)
e
else {
// path compression: the parent of e
c.parent = find(c.parent)
c.parent
}
}
/**
* if both have the same root, return true
* @param x
* @param y
* @return
*/
def same(x: E, y: E) : Boolean = {
find(x) == find(y)
}
/**
* Union the two sets containing x and y
* @param x
* @param y
*/
def union(x: E, y: E) {
val xRoot = containerOf(find(x))
val yRoot = containerOf(find(y))
// Compare the rank of two root nodes
if (xRoot.rank > yRoot.rank) {
// x has a higher rank
yRoot.parent = xRoot.elem
}
else {
// y has a higher rank
xRoot.parent = yRoot.elem
// If the ranks are the same, increase the rank of the other
if (xRoot.rank == yRoot.rank)
yRoot.rank += 1
}
}
private def containerList = elemToContainerIndex.values
override def size = elemToContainerIndex.size
def contains(e: E) = elemToContainerIndex.contains(e)
/**
* Iterator of the elements contained in this set
* @return
*/
def iterator = containerList.map(_.elem).toIterator
/**
* Iterator of the root nodes of the groups
* @return
*/
def representatives: Iterable[E] =
for(c <- containerList if c.isRoot) yield c.elem
/**
* Return the elements belonging to the same group with e
* @param e
* @return
*/
def elementsInTheSameClass(e: E) : Iterable[E] = {
val root = containerOf(find(e))
for(c <- containerList if find(c.elem) == root.elem) yield c.elem
}
/**
* Iterator of each group
* @return
*/
def groups: Iterable[Iterable[E]] =
for (r <- representatives) yield elementsInTheSameClass(r)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment