-1167C Codeforces

Ссылка:

https://vjudge.net/problem/CodeForces-1167C

Значение вопросов:

В какой-то социальной сети, есть п пользователей сообщающиеся друг с другом в м групп друзей. Рассмотрим процесс распространения некоторых новостей между пользователями.

Первоначально некоторые пользователь х получают новости из какого-либо источника. Затем он передает новости своих друзей (два пользователя друзьями, если есть по крайней мере одна группа, что оба они принадлежат к этой группе). Друзья продолжают посылать новости своим друзьям, и так далее. Процесс заканчивается, когда нет пары друзей, таких, что один из них знает новость, и еще никто не знает.

Для каждого пользователя х вы должны определить, что число пользователей, которые будут знать новости, если первоначально только пользователь начинают й распределяя его.

Идеи:

Disjoint-номер набора в статистической группе.

Код:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;

const int MAXN = 5e5+10;
int Fa[MAXN], Sum[MAXN];
int n, m;

int GetF(int x)
{
    if (Fa[x] == x)
        return x;
    Fa[x] = GetF(Fa[x]);
    return Fa[x];
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 1;i <= n;i++)
        Fa[i] = i;
    for (int i = 1;i <= m;i++)
    {
        int k, h, v;
        cin >> k;
        if (k)
            cin >> h;
        int he = GetF(h);
        for (int j = 1;j < k;j++)
        {
            cin >> v;
            int tv = GetF(v);
            if (tv != he)
                Fa[tv] = he;
        }
    }
    for (int i = 1;i <= n;i++)
    {
        int t = GetF(i);
        Sum[t]++;
    }
    for (int i = 1;i <= n;i++)
        cout << Sum[GetF(i)] << ' ';
    cout << endl;

    return 0;
}

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

отwww.cnblogs.com/YDDDD/p/11361204.html