%%% http://www.cnblogs.com/zhj5chengfeng/archive/2013/07/29/3224092.html
给定一个图,输出任意一种最大独立点集的方案。
于是构建补图跑最大团即可。
#include <cstdio> #include <cstring> using namespace std; const int N = 105; int ans, f[N], set[N][N], a[N][N], tmp[N], group[N]; bool dfs(int sz, int dep) { if (!sz) if (dep > ans) return memcpy(group, tmp, sizeof tmp), ans = dep, 1; else return 0; for (int i = 1; i <= sz; i++) { if (dep + sz - i + 1 <= ans) return 0; int u = set[dep][i]; if (dep + f[u] <= ans) return 0; int num = 0; for (int j = i + 1; j <= sz; j++) if (a[u][set[dep][j]]) set[dep + 1][++num] = set[dep][j]; tmp[dep + 1] = u; if (dfs(num, dep + 1)) return 1; } return 0; } int main() { int n, k, i, j, sz, t, x, y; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &k); memset(a, 1, sizeof a); while (k--) scanf("%d%d", &x, &y), a[x][y] = a[y][x] = 0; ans = 0; for (i = n; i; i--) { sz = 0; tmp[1] = i; for (j = i + 1; j <= n; j++) if (a[i][j]) set[1][++sz] = j; dfs(sz, 1); f[i] = ans; } printf("%d\n", ans); for (i = 1; i < ans; i++) printf("%d ", group[i]); printf("%d\n", group[ans]); } return 0; }
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 4612 | Accepted: 2114 | Special Judge |
Description
Input
Output
Sample Input
1 6 8 1 2 1 3 2 4 2 5 3 4 3 6 4 6 5 6
Sample Output
3 1 4 5