poj 1419 Graph Coloring_最大独立集

来源:互联网 发布:如何评价aqours 知乎 编辑:程序博客网 时间:2024/06/06 04:40

题目链接

题意:给出你一个无向图,然后对其中的点去上色, 只能上黑色和白色,要求是黑色点不能相邻,问最多能上多少黑色的顶点.

思路:点独立集:设无向图G=<V,E>,顶点集合V'是V的子集,若V'中的任意两个顶点都不相邻,则称V'为G的点独立集
这题求的是最大独立集
还有一个定理是最大独立集=补图的最大团
最大团=补图的最大独立集

#include<stdio.h>#include<string.h>#define MAXN 100int n,map[MAXN][MAXN],best,num[MAXN],res[MAXN],x,black[MAXN];bool dfs(int *tmp,int total,int cnt){int i,j,k,a[MAXN];if(!total){if(best<cnt){best=cnt;for(i=0;i<x;i++)black[i]=res[i];return true;}return false;}for(i=0;i<total;i++){if(cnt+(total-i)<=best)return false;if(cnt+num[tmp[i]]<=best)return false;res[x++]=tmp[i];for(k=0,j=i+1;j<total;j++)if(map[tmp[i]][tmp[j]])a[k++]=tmp[j];if(dfs(a,k,cnt+1))return true;x--;}return false;}int MaxNumClique(){int i,j,k,tmp[MAXN];best=0;for(i=n;i>=1;i--){x=0;for(k=0,j=i+1;j<=n;j++)if(map[i][j])tmp[k++]=j;res[x++]=i;dfs(tmp,k,1);num[i]=best;}return best;}int main(int argc, char** argv) {int i,j,m,x,y,t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(map,1,sizeof(map));for(i=1;i<=n;i++)map[i][i]=0;for(i=0;i<m;i++){scanf("%d%d",&x,&y);map[x][y]=map[y][x]=0;}printf("%d\n",MaxNumClique());for(i=0;i<best-1;i++)printf("%d ",black[i]);printf("%d\n",black[i]);}return 0;}


0 0
原创粉丝点击