独立树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;

}

文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。

你可能感兴趣的:(color)