Graph Coloring&&http://poj.org/problem?id=1419最大团问题

好久没做题了,做起题来感觉各种没感觉,简直弱爆了,

先说下这一题题意:就是给你一个无向图,有黑白两种颜色,让你对该图进行染色,要求任意相邻两点不能为同一种颜色,问你最后可以染多少个黑色的顶点,很显然是让你求最大独立集问题(所求得的该顶点集中任意两点都没有边),而经分析可知最大独立集=相对应完全图补图的最大团

而求最大团很容易想到用子集树来求,只需带一下子集树的模板就行了·~~

AC代码:

#include <iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define N 105
using namespace std;
bool map[N][N];
int n,best[N];
bool x[N];
int Maxnum;
void in(int &a)
{
    char ch;
    while((ch=getchar())<'0'||ch>'9');
    for( a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0';

}
bool place(int t)
{
    for(int i=1;i<t;++i)
    if(x[i]&&!map[i][t]) return false;
    return true;
}
void dfs(int t,int num)
{
    if(t>n)//边界条件
    {
        Maxnum=num;
        int k=0;
        for(int i=1;i<=n;++i)
         if(x[i]) best[++k]=i;
        return;
    }
    if(place(t))//约束条件
    {
        x[t]=true;
        dfs(t+1,num+1);
    }
    if(num+n-t>=Maxnum) //限界条件
    {  
        x[t]=false;
        dfs(t+1,num);
    } 

}
int main()
{
    int T;
    in(T);
    while(T--)
    {
       Maxnum=0;
       CLR(x,false);
       int k;
      in(n),in(k);
      for(int i=1;i<=n;++i)
       for(int j=1;j<=n;++j)
         map[i][j]=true;
         for(int i=0;i!=k;++i)
         {
             int a,b;
             in(a),in(b);
             map[a][b]=map[b][a]=false;
         }
        dfs(1,0);
        cout<<Maxnum<<endl;
        for(int i=1;i<Maxnum;++i) cout<<best[i]<<" ";
        cout<<best[Maxnum]<<endl;
        }return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值