Cod sursa(job #477635)

Utilizator vladiiIonescu Vlad vladii Data 15 august 2010 18:06:23
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define maxn 30010
#define PB push_back
#define MKP make_pair
#define PII pair<int, int>

int N, M, X, Y;
int viz[maxn], deg[maxn];
vector<int> Vecini, B, G[maxn];
multiset<PII> Heap;
multiset<int> V[maxn];
multiset<PII>::iterator it;

int verifmuchie(int nod1, int nod2) {
    multiset<int>::iterator its;
    its = V[nod1].find(nod2);
    if(its != V[nod1].end()) {
         return 1;
    }
    else {
         return 0;
    }
}

void verifica() {
    int i, j;
    //verific daca B este subgraf complet
    for(i=0; i<B.size(); i++) {
         for(j=0; j<B.size(); j++) {
              if(B[i] != B[j]) {
                   //verific daca exista muchie intre B[i] si B[j]
                   if(!verifmuchie(B[i], B[j])) {
                        return;
                   }
              }
         }
    }
    //am subgraf complet
    if(B.size() > X) {
         X = B.size(); Y = 1;
    }
    else if(B.size() == X) {
         Y++;
    }
}

void rezolva(int nod) {
    Vecini.clear(); B.clear();
    for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
         if(!viz[*it]) {
              Vecini.PB((*it));
         }
    }

    int cite = Vecini.size();
    for(int i=0; i<(1 << cite); i++) {
         B.clear(); B.PB(nod);
         int nr = i;
         for(int j=0; j<cite; j++) {
              if(nr % 2) {
                   B.PB( Vecini[j] );
              }
              nr = nr / 2;
         }

         verifica();
    }
}

int main() {
    FILE *f1=fopen("count.in", "r"), *f2=fopen("count.out", "w");
    int i, j, p, q;

    fscanf(f1, "%d %d\n", &N, &M);
    for(i=1; i<=M; i++) {
         fscanf(f1, "%d %d\n", &p, &q);
         G[p].PB(q); G[q].PB(p);
         V[p].insert(q); V[q].insert(p);
         deg[p]++; deg[q]++;
    }

    for(i=1; i<=N; i++) {
         Heap.insert( MKP(deg[i], i) );
    }

    while(Heap.size()) {
         it = Heap.begin();
         int nod = (*it).second;

         rezolva(nod);

         Heap.erase(it);
         for(vector<int>::iterator it1=G[nod].begin(); it1!=G[nod].end(); it1++) {
              if(!viz[(*it1)]) {
                   it = Heap.find( MKP(deg[(*it1)], (*it1)) );
                   Heap.erase(it);

                   deg[(*it1)]--;
                   Heap.insert( MKP(deg[(*it1)], (*it1)) );
              }
         }

         viz[nod] = 1;
    }

    fprintf(f2, "%d %d\n", X, Y);
    fclose(f1); fclose(f2);
    return 0;
}