Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198170
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-08-06 11:04:44

最大独立集的问题描述如下:给定无向图G(V,E),其中AÍV,且EÇ{(i,j)½i,jÎA}=Æ,求A,使得½A½最大。一般地,我们都把最大独立集转化为最小覆盖集,然后根据逻辑运算定律求解

B=VA,则BÍV,且对于任意一条边(i,j)ÎE,有iÎBjÎB,所以B是图G(V,E)的最小覆盖集。在这个转化过程中就用到了点的“补集转化”——用点集V减去求解目标集合A,以得到新的目标集合B

 

 

 

#include<stdio.h>

const int Maxn=501;
bool g[Maxn][Maxn],visit[Maxn];
int link[Maxn];
int n;

bool find(int x)
{
    for(int i=0;i<n;i++)
    {
        if(g[x][i]&&!visit[i])
        {
            visit[i]=true;
            if(link[i]==-1||find(link[i]))
            {
                link[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                g[i][j]=false;

        for(int i=0;i<n;i++)
        {
            int num,k;
            scanf("%*d: (%d)",&num);
            for(int j=0;j<num;j++)
            {
                scanf("%d",&k);
                g[i][k]=true;
            }
        }

        int match=0;
        for(int i=0;i<n;i++)
            link[i]=-1;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                visit[j]=false;
            if(find(i))    match++;
        }
    
        printf("%d\n",n-match/2);
    }
    return 0;
}


阅读(764) | 评论(0) | 转发(0) |
0

上一篇:pku2060 Taxi Cab Scheme

下一篇:pku1159 Palindrome

给主人留下些什么吧!~~