练习DFS。

 

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 102
using namespace std;

const int M = 1001;
const int INF = 0X3F3F3F3F;
int G[M][M];
bool color[M], save[M];
int MAX;
int n, m;

int check(int u)
{
    for(int v = 1; v <= n; v++)
    {
        if(G[u][v] && color[v])
            return 0;
    }
    return 1;
}

void dfs(int u, int sum)
{
    if(u > n)
    {
        if(MAX < sum)
        {
            MAX = sum;
            memcpy(save, color, sizeof(color));
        }
        return ;
    }
    if(n-u+1+sum <= MAX) return ;        //剪枝
    if(check(u))
    {
        color[u] = 1;
        dfs(u+1, sum+1);
        color[u] = 0;
    }
    dfs(u+1, sum);
}

void init()
{
    memset(G, 0sizeof(G));
    memset(color, 0sizeof(color));
}

int main()
{
    int T, flag;
    scanf("%d", &T);
    while(T--)
    {
        init();
        flag = 1;
        scanf("%d%d", &n, &m);
        while(m--)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            G[u][v] = G[v][u] = 1;
        }
        MAX = -INF;
        dfs(10);
        printf("%d\n", MAX);
        for(int i = 1; i <= n; i++)
        if(flag && save[i])
        {
            printf("%d", i);
            flag = 0;
        }
        else if(save[i])
        {
            printf(" %d", i);
        }
        printf("\n");
    }
    return 0;
}

 

 

posted on 2012-09-24 21:15  有间博客  阅读(184)  评论(0编辑  收藏  举报