Rezolvare completă PbInfo #2155 Facebook_FMI

Ionuț tocmai a terminat liceul și susține examenul de admitere la facultate. Știind că s-a pregătit foarte bine pentru examen, el dorește să își anunțe reușita după examen printr-o postare pe Facebook.
Ionuț cunoaște n utilizatori reprezentați de numerele de la 1 la n, între care există m relații de prietenie de forma i j, unde i și j sunt utilizatori, iar n și m sunt numere naturale nenule. Un utilizator nu poate fi prieten cu el însuși, iar o relație de prietenie între doi utilizatori ne spune că fiecare dintre ei este prieten cu celălalt.

Întrucât dorește ca postarea lui să fie cât mai răspândită, Ionuț vrea să afle care sunt utilizatorii cei mai bine conectați din mulțimea sa de cunoscuți, pentru ca eventual să le ceară prietenia. Pentru aceasta, Ionuț trebuie să găsească cea mai mare submulțime de utilizatori cunoscuți, în care fiecare utilizator din această submulțime are cel puțin k prieteni aflați la rândul lor în submulțime, unde k este un număr natural nenul.

Cerința

Ajutați-l pe Ionuț să se determine și să se afișeze, printr-o soluție de complexitate timp cât mai bună, în funcție de datele de intrare, membrii celei mai mari submulțimi de utilizatori, cu proprietatea că fiecare utilizator din această submulțime are cel puțin k prieteni aflați la rândul lor în submulțime.

Date de intrare

Fișierul de intrare fb_fmi.in conține pe prima linie numerele n, m și k, separate prin spațiu, iar pe a doua linie 2•m numere naturale cuprinse între 1 și n, separate prin spațiu, reprezentând în ordine cele m relații de prietenie între cei n utilizatori.

Date de ieșire

Fișierul de ieșire fb_fmi.out va conține pe prima linie numărul natural Q ce reprezintă numărul maxim de membrii ai submulțimii de utilizatori care au cel puțin k prieteni, aflați la rândul lor în submulțime.
Pe următoarea linie, în ordine crescătoare, sunt enumerați utilizatori submulțimii. În cazul în care nu există o astfel de submulțime pentru k dat, în fișier se va scrie valoarea 0.

Restricții și precizări

  • 2 ≤ n ≤ 1.000

Exemplul 1:

fb_fmi.in

5 5 2
1 2 5 1 3 2 4 5 1 4

fb_fmi.out

3
1 4 5

Exemplul 2:

fb_fmi.in

5 5 3
1 2 5 1 3 2 4 5 1 4

fb_fmi.out

0

Exemplul 3:

fb_fmi.in

11 18 3
1 8 4 7 7 10 11 10 2 1 2 3 8 9 8 3 9 3 9 2 5 6 5 11 1 4 10 6 7 6 2 8 11 7 11 6

fb_fmi.out

8
2 3 6 7 8 9 10 11

Atenție!

Programele vor folosi doar instrucțiunile de bază ale limbajului de programare ales, inclusiv cele de intrare/ieșire, dar nu și alte funcții din biblioteci specializate.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Facebook_FMI:

# include <bits/stdc++.h>
# define NM 1001
using namespace std;

ifstream f("fb_fmi.in");
ofstream g("fb_fmi.out");

int n, m, k;
int d[NM];
bool a[NM][NM];

int main()
{
    int x, y;
    f >> n >> m >> k;
    for(int i=1; i<=m; ++i){
        f >> x >> y;
        a[x][y] = a[y][x] = 1;
        /// nr. de prieteni = grad
        d[x]++;
        d[y]++;
    }

    int i = 1;
    while( i <= n ) {

        if (d[i] < k && d[i] > 0) {

            for (int j=1; j<=n; ++j)
                if (a[i][j]) {
                    a[i][j] = a[j][i] = 0;
                    --d[j];
                }

            d[i] = 0;
            i = 1;
        }
        else ++i;
    }

    int nr = 0;
    for(int i=1; i<=n; ++i)
        if (d[i]) ++nr;

    g << nr << '\n';
    if (nr == 0) return 0;

    for(int i=1; i<=n; ++i)
        if (d[i]) g << i << ' ';
    g << '\n';

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2155 Facebook_FMI

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2155 Facebook_FMI de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!