POJ 1419 Graph Coloring 图的着色 最大团问题

来源:互联网 发布:未公开steam个人数据 编辑:程序博客网 时间:2024/06/06 00:49

这题是显然的最大独立集问题。

最大独立集问题和最大团问题可以转化的

最大独立集=补图的最大团

最大团的意思跟最大独立集正好相反,是取尽量多的点使得这些点任意两点之间都有边

而最大团一般是DFS回溯来解。。。复杂度太高了 竟然还能过

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <cstdio>#include <cmath>#include <queue>#include <map>#include <set>#define eps 1e-5#define MAXN 111#define MAXM 111111#define INF 1000000007using namespace std;int n, m;int mp[MAXN][MAXN];int bestcnt, cnt;int tmp[MAXN], res[MAXN];void dfs(int u){    if(u > n && cnt > bestcnt)    {        for(int i = 1; i <= n; i++) res[i] = tmp[i];        bestcnt = cnt;        return;    }    int flag = 1;    for(int i = 1; i < u; i++)        if(!mp[i][u] && tmp[i]) {flag = 0; break;}    if(flag)    {        tmp[u] = 1;        cnt++;        dfs(u + 1);        cnt--;    }    if(cnt + n - u > bestcnt)    {        tmp[u] = 0;        dfs(u + 1);    }}int main(){    int T;    scanf("%d", &T);    while(T--)    {        int u, v;        scanf("%d%d", &n, &m);        memset(mp, 0, sizeof(mp));        while(m--)        {            scanf("%d%d", &u, &v);            mp[u][v] = mp[v][u] = 1;        }        for(int i = 1; i <= n; i++)            for(int j = 1; j <= n; j++)                mp[i][j] = !mp[i][j];        memset(res, 0, sizeof(res));        memset(tmp, 0, sizeof(tmp));        cnt = bestcnt = 0;        dfs(1);        printf("%d\n", bestcnt);        for(int i = 1; i <= n; i++)            if(res[i]) printf("%d ", i);        printf("\n");    }    return 0;}