poj 1419(最大独立集)

最大独立集即最大团内点的数量

http://www.cnblogs.com/jianglangcaijin/p/6035945.html付最大独立集和二分图关系

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=200;
int g[maxn][maxn];
int bb[maxn],b[maxn];
int t,n,m;
int ans,cnt;
void dfs(int x)
{
    if(x>n)
    {
        if(cnt>ans)
        {
            memcpy(b,bb,sizeof(bb));
            ans=cnt;
        }
return; }
int flag=1; for(int i=1; i<x; i++)//维护最大团 if(bb[i]&&!g[x][i])//这个点不能入最大团 { flag=0; break; } if(flag) { cnt++,bb[x]=1;//把点放入 dfs(x+1); cnt--,bb[x]=0; } if(n-x+cnt>ans)//假设剩余点都是最大团内的点,并且都加进去后可以大于ans dfs(x+1); } void init() { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { g[i][j]=1; } memset(bb,0,sizeof(bb)); memset(b,0,sizeof(b)); ans=0; cnt=0; } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); int x,y; for(int i=1; i<=m; i++) { scanf("%d%d",&x,&y); g[x][y]=0; g[y][x]=0; } dfs(1); printf("%d\n",ans); int first=0; for(int i=1; i<=n; i++) if(b[i]) { if(!first) first=1; else printf(" "); printf("%d",i); } printf("\n"); } return 0; }

 

posted on 2017-10-09 17:36  发牌员  阅读(201)  评论(0)    收藏  举报

导航