【poj1419】 Graph Coloring

http://poj.org/problem?id=1419 (题目链接)

题意

  求一般图最大独立集。

Solution

  最大独立集=补图的最大团。

代码

// poj1419
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
 
const int maxn=200;
int f[maxn][maxn],c[maxn][maxn],p[maxn],ans[maxn],mx[maxn];
int n,m,cnt;

void Init() {
	memset(f,1,sizeof(f));cnt=0;
	for (int i=1;i<=n;i++) c[0][i]=1;
}
void record(int s) {
	cnt=s;
	for (int i=1;i<=s;i++) ans[i]=p[i];
}
void dfs(int fa,int x,int s) {
	if (n-x+s<cnt || s+mx[x+1]<cnt) return;   //cut
	p[s]=x;
	if (cnt<s) record(s);
	for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) c[x][i]=1;
	for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) dfs(x,i,s+1);
	for (int i=x+1;i<=n;i++) c[x][i]=0;
}
int main() {
	int T;scanf("%d",&T);
	while (T--) {
		scanf("%d%d",&n,&m);
		Init();
		for (int u,v,i=1;i<=m;i++) {
			scanf("%d%d",&u,&v);
			f[u][v]=f[v][u]=0;
		}
		for (int S=n;S>=1;S--) {   //倒着搜索
			dfs(0,S,1);
			mx[S]=cnt;   //记忆化一下
		}
		printf("%d\n",cnt);
		for (int i=1;i<=cnt;i++) printf("%d ",ans[i]);
		puts("");
	}
	return 0;
}

  

posted @ 2016-12-17 19:41  MashiroSky  阅读(233)  评论(0编辑  收藏  举报