图的着色问题,转换为最大团问题,只有黑色不相邻就行。
1419
void clique(int n, int* u, int mat[][MAXN], int size, int& max, int& bb, int* res, int* rr, int* c) {
int i, j, vn, v[MAXN];
if (n) {
if (size + c[u[0]] <= max) return;
for (i = 0; i < n + size - max && i < n; ++ i) {
for (j = i + 1, vn = 0; j < n; ++ j)
if (mat[u[i]][u[j]])
v[vn ++] = u[j];
rr[size] = u[i];
clique(vn, v, mat, size + 1, max, bb, res, rr, c);
if (bb) return;
}
} else if (size > max) {
max = size;
for (i = 0; i < size; ++ i)
res[i] = rr[i];
bb = 1;
}
}
int maxclique(int n, int mat[][MAXN], int *ret) {
int max = 0, bb, c[MAXN], i, j;
int vn, v[MAXN], rr[MAXN];
for (c[i = n - 1] = 0; i >= 0; -- i) {
for (vn = 0, j = i + 1; j < n; ++ j)
if (mat[i][j])
v[vn ++] = j;
bb = 0;
rr[0] = i;
clique(vn, v, mat, 1, max, bb, ret, rr, c);
c[i] = max;
}
return max;
}
int main()
{
int n;
int mat[MAXN][MAXN],ret[MAXN];
SCF(n);
while(n--)
{
int sum=0,a,b,m,h;
SCF(m);SCF(h);
SET(mat,1);SET(ret,0);
F(j,h)
{
SCF(a);SCF(b);
mat[a-1][b-1]=mat[b-1][a-1]=0;
}
PCFLN(maxclique(m,mat,ret));
F(i,m)
{
if(ret[i]||i==0) PCF(ret[i]+1);
else break;
if(i!=m-1)
printf(" ");
}
printf("\n");
}
}