質問の意味:https://codeforc.es/contest/1209/problem/D
n個のデザートがありますが、kの個人が存在し、誰もが2つのお気に入りのスナックを持っている、そして今彼らにランク付けしチームを与える限り、誰もが自分の好きなスナックを持っているように、食べるために人は人に食われる(残されることはありません)。
誰かが幸せではない場合は、少なくとも不幸な人を配置する方法を尋ねる、食べるために何もできなくなります。
アイデア:
グラフ問題として、デザートは、人がエッジであるノードです。通信の各ブロックについて、常に2つのスナックを食べている、他の人が(ここで、他の人が食べられます)を食べます。
これは、最適な、すべての答えがそれぞれ接続された通信ブロック番号X-1である保証します。
1つ の#define IOSはios_base :: sync_with_stdio(0)。cin.tie(0)。 2の#include <cstdioを> // のsprintf islowerはisupper 3の#include <cstdlib> // のmalloc出口STRCATのitoaはシステム( "CLS") 4の#include <入出力ストリーム> // 対 5の#include <fstreamの> // freopenは(「C :\\ユーザー\\ 13606 \\デスクトップ\\草稿.TXT」、 "R"、STDIN); 6の#include <ビットセット> 7 // の#include <地図> 8 // の#include <unordered_map> 9の#include <ベクトル> 10の#include <積層> 12の#include < 文字列・H> // はstrstr SUBSTR 13の#include < ストリング > 14の#include <TIME.H> // にsrand(((符号なし)時間(NULL)))。シードN =ランド()%10から0〜9。 15の#include <cmath> 16の#include <両端キュー> 17の#include <キュー> // PRIORITY_QUEUE <整数、ベクトル<整数>、大きな<整数>> Q。// 以下 18の#include <ベクトル> // emplace_back 19 // の#include <math.h>の 20 // の#include <WINDOWS.H> // (+ LEN)逆。〜!〜!床 21の#include <アルゴリズム> // ソート+ユニーク:SZ =一意(B + 1、B + N + 1) - (B + 1)+ nth_element(第一、第nは、最後に、比較) 22 使用 名前空間 STDを、// next_permutation(A + 1、A + 1個の+ N)。// prev_permutation 23 の#define RINTは整数レジスタ 24 の#defineを foは(A、B、C)(RINTのA = B; <= C; ++ A)のための 25 の#define FR(A、B、C)のための(RINT A = B;> = C; - A) 26 の#define MEM(A、B)のmemset(A、B、はsizeof(A)) 27回 の#define PRのprintf 28回 の#define SCのscanf 29回 の#defineのLS RT << 1 30回 の#defineのRS RT << 1 | 1 31 typedefの長い 長いLL。 32 ボイド swapp(INT&A、INT&B)。 33 ダブル fabss(ダブルA)。 34 int型 MAXX(int型、int型のB)。 35 INTミネソタ州(INT A、INT B)。 36 INT Del_bit_1(int型N); 37 INT lowbit(INT N)。 38の int型の ABS面(int型A); 39 constの ダブル E = 2.718281828 ; 40 のconst ダブル PI = ACOS( - 1.0 )。 41 // CONST LL INF =(1LL << 60)。 42 のconst int型 INF =(1 << 30 )。 43 CONST ダブル ESP = 1E- 9 。 44 CONST INT MOD =(INT)1E9 + 7 。 45 のconst int型 N =(INT)1E6 + 10 。 46 47 BOOLF [N] である[N]。 48ベクトル<ベクトル< 整数 >> G(N)。 49 50 INT BFS(INT 開始) 51 { 52 であれば(F [開始])リターン 1 。 53 INTの和= 0 。 54 キュー< 整数 > Q; 55 q.push(スタート)。 56 ながら(!q.empty()) 57 { 58 INT今= q.front(); q.pop()。 59 であれば([今F)続行; 60 F [今] = 1 。 61 合計++ ; 62 INT SZ = G [今] .size()。 63 のためには、(int型 i = 0 ; iはSZを<; ++ I) 64 q.push([今] G [I])。 65 } 66 リターン和。 67 } 68 69 INT ()は、メイン 70 { 71 int型N、K。 72 SC(" %d個の%のD "、&N&K)。 73 のために(int型 = Iを1 ; iは= Kを<; ++ I) 74 { 75 INT U、V。 76 SC(" %D%dの"、&U、およびV)。 77 で [U] = である [V] = 1 。 78 G [U] .push_back(V)。 79 G [V] .push_back(U)。 80 } 81 INT ANS = 0 。 82 のために(int型 I = 1 ++; iが<= N I) 83 であれば(れる[i])と 84 ANS + = BFS(I) - 1 。 85の PR(" %d個の\ n "、K- ANS)。 86 リターン 0 ; 87 } 88 89 / * ******************************************** **************************************** * / 90 91 int型 MAXX(int型、int型b)の 92 { 93 リターン A> B?A:B; 94 } 95 96 空隙 swapp(INT&A、INT&B) 97 { 98 、A ^ = B ^ = A ^ = B。 99 } 100 101 INTの lowbit(int型N) 102 { 103 リターン N&( - N)。 104 } 105 106 INT Del_bit_1(int型N) 107 { 108 リターン N・(N- 1 )。 109 } 110の 111 INTの ABS面(INT A) 112 { 113 戻り A> 0: - ? 。 114 } 115 116 ダブル fabss(ダブルA) 117 { 118 戻り A> 0: - ? 。 119 } 120 121 INTミネソタ州(INT A、INT B) 122 { 123 リターン <B?A:B; 124 }