fbpx

Problema #1462 – Gasti – Rezolvari PBInfo

de Mihai-Alexandru

În orașul Nicăieri există N băieți răi. Se știe că între ei există M relații de prietenie. De-a lungul timpului, aceste prietenii au dus la apariția unor “găști”. Dacă doi băieți nu sunt prieteni dar au cel puțin un prieten comun spunem că “se cunosc”. Dacă doi băieți au cel puțin o cunoștință comună, atunci și ei se cunosc.
O gașcă este un grup de băieți cu proprietatea că oricare ar fi doi băieți x și y din grup, aceștia “se cunosc”.

Cerința

Arpsod, știe exact cine este prieten cu cine și, fiind singurul băiat bun din oraș, și-a pus următoarele întrebări:

Exemplu

gasti.in

5 3
1 2
2 3
3 1

gasti.out

3 6

Explicație

Există 3 găști în oraș, formate:

Gașca 1: 1, 2, 3
Gașca 2: 4
Gașca 3: 5

Sunt 6 moduri de a face o relație de prietenie astfel încât gașca obținută să aibă număr maxim de membri

4 cu 1, 4 cu 2, 4 cu 3, 5 cu 1, 5 cu 2, 5 cu 3

#include <bits/stdc++.h>

using namespace std;

ifstream cin("gasti.in");
ofstream cout("gasti.out");

#define mod 666013
int n , m , x , y , v[100001] , cnt , f[100001] , maxi , maxi2 , fmaxi , fmaxi2;
vector <int> G[100001];

void dfs(int nod, int cnt)
{
   v[nod] = cnt;
   for(auto i : G[nod])
        if(!v[i]) v[i] = cnt , dfs(i , cnt);
}

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i++)
    {
        cin >> x >> y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    for(int i = 1 ; i <= n ; i++)
        if(!v[i]) cnt++ , dfs(i , cnt);

    ///cer 1
    cout << cnt << ' ';

    ///cer 2

    for(int i = 1 ; i <= n ; i++)
        f[v[i]]++;

    for(int i = 1 ; i <= n ; i++)
        if(f[i] > maxi) maxi = f[i];

    for(int i = 1 ; i <= n ; i++)
        if(f[i] == maxi) fmaxi++;

    if(fmaxi > 1)
    {
        cout << 1ll * fmaxi * (fmaxi - 1) / 2 % mod * maxi % mod * maxi % mod;
    }
    else
    {
        for(int i = 1 ; i <= n ; i++)
            if(f[i] > maxi2 && f[i] != maxi) maxi2 = f[i];
        for(int i = 1 ; i <= n ; i++)
            if(f[i] == maxi2 && f[i] != maxi) fmaxi2++;
        cout << 1ll * fmaxi2 % mod * maxi % mod * maxi2 % mod;
    }

}
Comentarii

S-ar putea sa iti placa