Ссылка:
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;
}