首页 > 代码库 > 【poj1419】 Graph Coloring

【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;}

  

【poj1419】 Graph Coloring