码迷,mamicode.com
首页 > 其他好文 > 详细

【poj1419】 Graph Coloring

时间:2016-12-17 22:19:47      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:target   for   str   queue   inf   cst   div   namespace   dfs   

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

标签:target   for   str   queue   inf   cst   div   namespace   dfs   

原文地址:http://www.cnblogs.com/MashiroSky/p/6192965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!