POJ1419 Graph Coloring

来源:互联网 发布:预防网络诈骗班会流程 编辑:程序博客网 时间:2024/05/29 19:14
一般图的最大独立集=补图的最大团。
直接套最大团的模板
#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;}
原创粉丝点击