https://codeforces.com/contest/1167/problem/C
Смысл проблем: N пользователей существует м группа, каждый пользователь может появиться во множестве пакетов, пакет также позволяет нуль. Каждое сообщение пользователя может каждый в той же группе, стремится к каждому пользователю отправлять сообщения на число лиц.
Идеи: Взвешенные непересекающиеся-набор, дерево любой человек может передать сообщение всем остальным на дереве. гк массив сохранения точки принадлежит дерево имеет ряд узлов (включая корень). гк выходное значение каждого узла является ответом
# include <бит / STDC ++ ч.> с использованием пространства имен STD; ЬурейеЕ долго долго LL; Const INT maxn = 5e5 + 5 ; INT ра [maxn]; INT гк [maxn]; ИНТ находка ( INT х) { возвращение ра [х] == х? х: ра [х] = найти (ра [х]); } Недействительными объединяются ( Int а, INT б) { = найти (а), б = найти (б); если (а == б) возвращение ; если (гк [а] < гк [Ь]) { ра [а] = Ь; гк [Ь] + = гк [а]; } Иначе { ра [Ь] = а; гк [а] + = гк [Ь]; } } INT основных () { // freopen ( "datain.txt", "г", STDIN); IOS :: sync_with_stdio ( 0 ); cin.tie ( 0 ); INT п, м; CIN >> п >> м; для ( INT I = 0 ; <п; я ++) ра [I] = я, гк [I] = 1 ; для ( INT I = 0 ; г <м; я ++ ) { ИНТ к; CIN >> к; если (к == 0 ) продолжить ; INT последний = - 1 , дворняжка; CIN >> последняя; прошлой; для ( INT J = 1 , J <к; j ++ ) { CIN >> дворняжка; текущ; объединение (тек, последний); } } Для ( INT I = 1 ; г <= п; я ++ ) { соиЬ << гк [найти (я)] << ' ' ; } // соиЬ << гк [найти (0)]; соиЬ << епсИ; }