HDU 1068

http://acm.hdu.edu.cn/showproblem.php?pid=1068

应用匈牙利算法第三个扩展,求二分图的最大独立集,但由于路径是双向的,所以求出的最大匹配是实际最大匹配数*2,还要再除回去才行,单向路径就没有这个问题

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std ;

struct node{

    int s,t,nxt ;

}e[10005] ;

int head[5005],vis[5005],match[5005],cnt,n,m ;

int find(int s)

{

    for(int i=head[s] ;i!=-1 ;i=e[i].nxt)

    {

        int tt=e[i].t ;

        if(!vis[tt])

        {

            vis[tt]=1 ;

            if(match[tt]==-1 || find(match[tt]))

            {

                match[tt]=s ;

                return 1 ;

            }

        }

    }

    return 0 ;

}

int max_match()

{

    int ans=0 ;

    memset(match,-1,sizeof(match)) ;

    for(int i=0 ;i<n ;i++)

    {

        memset(vis,0,sizeof(vis)) ;

        ans+=find(i) ;

    }

    return ans ;

}

void add(int s,int t)

{

    e[cnt].s=s ;

    e[cnt].t=t ;

    e[cnt].nxt=head[s] ;

    head[s]=cnt++ ;

}

int main()

{

    while(~scanf("%d",&n))

    {

        memset(head,-1,sizeof(head)) ;

        cnt=0 ;

        for(int i=0 ;i<n ;i++)

        {

            scanf("%*d%*c%*c%*c%d%*c",&m) ;

            //printf("%d!!\n",m) ;

            for(int j=0 ;j<m ;j++)

            {

                int t ;

                scanf("%d",&t) ;

                add(i,t+n) ;

            }

        }

        printf("%d\n",n-max_match()/2) ;

    } 

    return 0 ; 

}
View Code

 

 

你可能感兴趣的:(HDU)