最大團模板
void clique(int n, int* u, int mat[][MAXN], int size, int& max, int& bb, int* res, int* rr, int* c) {<br /> int i, j, vn, v[MAXN];<br /> if (n) {<br /> if (size + c[u[0]] <= max) return;<br /> for (i = 0; i < n + size - max && i < n; ++i) {<br /> for (j = i + 1, vn = 0; j < n; ++j)<br /> if (mat[u[i]][u[j]]) v[vn++] = u[j];<br /> rr[size] = u[i];<br /> clique(vn, v, mat, size + 1, max, bb, res, rr, c);<br /> if (bb) return;<br /> }<br /> }<br /> else<br /> if (size > max) {<br /> max = size;<br /> for (i = 0; i < size; ++i) res[i] = rr[i];<br /> bb = 1;<br /> }<br />}<br />int maxclique(int n, int mat[][MAXN], int *ret) {<br /> /* ret 數組為一個方案 */<br /> int max = 0, bb, c[MAXN], i, j;<br /> int vn, v[MAXN], rr[MAXN];<br /> for (c[i = n - 1] = 0; i >= 0; --i) {<br /> for (vn = 0, j = i + 1; j < n; ++j)<br /> if (mat[i][j]) v[vn++] = j;<br /> bb = 0;<br /> rr[0] = i;<br /> clique(vn, v, mat, 1, max, bb, ret, rr, c);<br /> c[i] = max;<br /> }<br /> return max; /* 最大團大小 */<br />}