poj 1419 Graph Coloring (最大独立集 dfs)

来源:互联网 发布:敏捷软件开发流程 编辑:程序博客网 时间:2024/06/05 18:45
/// 一个无向图中,使用黑白两种颜色对顶点着色,要求相邻顶点不能同时为黑色,求最大能染黑色顶点数量以及对应顶点。#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>using namespace std;vector<int>g[110];int n;int vis[110];int num[110];int maxx;void dfs(int x,int cot){    if(x==n+1)    {        if(cot>maxx)        {            int ans=0;            for(int i=1; i<=n; i++)            {                if(vis[i])                    num[ans++]=i;            }            maxx=cot;        }        return ;    }    int flag=1;    for(int i=0; i<g[x].size(); i++)    {        if(vis[g[x][i]])///已经有黑色        {            flag=0;            break;        }    }    if(flag)    {        vis[x]=1;        dfs(x+1,cot+1);        vis[x]=0;    }    dfs(x+1,cot);    return ;}void init(){    for(int i=1; i<=n; i++)    {        g[i].clear();        memset(vis,0,sizeof(vis));        memset(num,0,sizeof(num));    }}int main(){    int t,k,u,v;    while(~scanf("%d",&t))    {        while(t--)        {            scanf("%d%d",&n,&k);            init();            while(k--)            {                scanf("%d%d",&u,&v);                g[u].push_back(v);                g[v].push_back(u);            }            maxx=-1;            dfs(1,0);            printf("%d\n",maxx);            int flag=1;            for(int i=0; i<n; i++)            {                if(flag&&num[i])                {                    printf("%d",num[i]);                    flag=0;                }                else if(num[i])                    printf(" %d",num[i]);            }            printf("\n");        }    }    return 0;}

0 0
原创粉丝点击