POJ1419 Graph Coloring

一般图的最大独立集=补图的最大团。
直接套最大团的模板
 
 
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <queue>
#include <vector>
#define inf 0x7fffffff
#define met(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N = 105;
const int M = 25005;
bool w[N][N];
bool use[N]; //进入团的标号
bool bestx[N];
int cn,bestn,p,e;

void dfs(int x) {
    bool flag;
    if(x>p) {
        bestn=cn; //cn的值是递增的
        for( int i=1;i<=p; i++) //赋值给另外一个数组,
            bestx[i]=use[i];
        return ;
    }
    flag=true;
    for( int i=1; i<x; i++)
        if(use[i]&&!w[i][x]) {
            flag=false;
            break;
        }
    if(flag) {
        cn++;
        use[x]=true;
        dfs(x+1);
        cn--;
        use[x]=false;//回溯
    }
    if(cn+p-x>bestn) { //剪枝
        dfs(x+1);
    }
}

int main() {
    int num,u,v;
    scanf("%d",&num);
    while(num--) {
        memset(w,true,sizeof(w));
        memset(use,false,sizeof(use));
        memset(bestx,false,sizeof(bestx));
        scanf("%d%d",&p,&e);
        for(int i=0; i<e; i++) {
            scanf("%d%d",&u,&v);
            w[u][v]=false;
            w[v][u]=false;
        }
        cn=bestn=0;
        dfs(1);
        printf("%d\n",bestn);
        for (int i=1; i<=p; i++)if(bestx[i])printf("%d ",i);printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值