Pagini recente » Cod sursa (job #761334) | Cod sursa (job #481726) | Cod sursa (job #1088716) | Cod sursa (job #520278) | Cod sursa (job #477635)
Cod sursa(job #477635)
#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;
}