CF1167C Новости Распределение Weighted непересекающихся набора

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)];
    соиЬ << епсИ; 
}

 

рекомендация

отwww.cnblogs.com/hanker99/p/10968444.html
рекомендация