
Untitled
By: a guest on
Jun 30th, 2012 | syntax:
C | size: 1.44 KB | hits: 19 | expires: Never
#define LIM 99
#include<cstdio>
#include<cstdlib>
#include<cstring>
int max, nv, ne[LIM];
char edges[LIM][LIM];
void BronKerbosch(char r[], char p[], char x[]) {
int i, j, pivot, deg=0;
char nr[LIM], np[LIM], nx[LIM];
if(p[0] == 0 && x[0] == 0) {
if(r[0] > max) max = r[0];
return;
}
for(i = 1; i <= nv; i++) {
if(p[i] && ne[i] >= deg) {
pivot = i;
deg = ne[i];
}
}
for(i = 1; i <= nv; i++) {
if(p[i] && !edges[pivot][i]) {
p[i] = 0;
p[0]--;
if(ne[i] >= r[0]) {
np[0] = 0;
nx[0] = 0;
for(j = 1; j <= nv; j++) {
np[j] = p[j] & edges[i][j];
np[0] += np[j];
nx[j] = x[j] & edges[i][j];
nx[0] += nx[j];
}
memcpy(nr, r, nv+1);
nr[i] = 1;
nr[0]++;
BronKerbosch(nr, np, nx);
}
x[i] = 1;
x[0]++;
}
}
}
int main() {
int i, j, t = 0;
char r[LIM], p[LIM], x[LIM];
while(1) {
scanf("%d", &nv);
if(!nv) break;
for(i = 1; i <= nv; i++) {
ne[i] = nv-1;
for(j = 1; j <= nv; j++)
edges[i][j] = 1;
}
r[0] = 0;
p[0] = nv;
x[0] = 0;
for(i = 1; i <= nv; i++) {
r[i] = 0;
p[i] = 1;
x[i] = 0;
edges[i][i] = 0;
while(1) {
scanf("%d", &j);
if(!j) break;
if(edges[i][j]) ne[i]--;
edges[i][j] = 0;
if(edges[j][i]) ne[j]--;
edges[j][i] = 0;
}
}
max = 0;
BronKerbosch(r, p, x);
printf("Teste %d\n%d\n\n", ++t, max);
}
return 0;
}