MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 1419

Posted on 2011-06-08 17:24  MDeath-Kid  阅读(255)  评论(0编辑  收藏  举报

图的着色问题,转换为最大团问题,只有黑色不相邻就行。

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");
}

}