poj 1419 Graph Coloring

这道题要求的就是一个图的最大独立集,而我们知道一个图的最大独立集等于这个图的补图的最大团。使用BK算法求解即可。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N=109;
int ans,n,m,a[N][N],cnt[N],vis[N],Ans[N];

int dfs(int x,int now)
{
	for (int i=x+1;i<=n;i++)
	{
		if(cnt[i]+now<=ans) return 0;
		if(!a[x][i]) continue;
		int j;
		for (j=1;j<now;j++) 
			if(!a[i][vis[j]]) break;
		if(j==now)
		{
			vis[now]=i;
			if(dfs(i,now+1)) return 1;
		}
	}
	if(now>ans+1)
	{
		ans=now-1;
		for (int i=1;i<=ans;i++)
			Ans[i]=vis[i];
		return 1;
	}
	return 0;
}

void init()
{
	scanf("%d %d",&n,&m);
	memset(a,0,sizeof(a));
	for (int i=1,x,y;i<=m;i++)
		scanf("%d %d",&x,&y),a[x][y]=a[y][x]=1;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			a[i][j]^=1;
}

void work()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		init();
		ans=-1;
		for (int i=n;i>=1;i--)
		{
			vis[1]=i;
			dfs(i,2);
			cnt[i]=ans;
		}
		printf("%d\n",ans);
		for (int i=1;i<=ans;i++)
			printf("%d ",Ans[i]);puts("");
	}
}

int main()
{
	work();
	return 0;
}
posted @ 2020-06-03 20:39  With_penguin  阅读(335)  评论(0编辑  收藏  举报