POJ 3692 Kindergarten ( 最大独立点集 )

这道题是求最大独立点集!

最大独立点集=N - 最小顶点覆盖=N-最大匹配。

反建图,将不认识的连上边!

代码:

#include <cstdio>
#include <cstring>

const int N = 220;
int ln, rn, M;
int bmap[N][N], cy[N];
bool used[N];

bool dfs( int u ) 
{
    for ( int v = 1; v <= rn; ++v ) if ( bmap[u][v] && !used[v] ) {
        used[v] = 1;
        if ( cy[v] == -1 || dfs( cy[v] ) ) {
            cy[v] = u;
            return 1;
        }
    }
    return false;
}
int match()
{
    int res = 0;
    memset(cy, -1, sizeof(cy));
    for ( int i = 1; i <= ln; ++i ) {
        memset( used, 0, sizeof(used));
        if ( dfs(i) ) res++;
    }
    return res;
}
int main()
{
    int icase = 1;
    while ( scanf("%d%d%d", &ln, &rn, &M) == 3 && M+ln+rn ) {
        for ( int i = 0; i <= ln; ++i ) 
            for ( int j = 0; j <= rn; ++j ) bmap[i][j] = 1;
        while ( M-- ) {
            int u, v;
            scanf("%d%d", &u, &v);
            bmap[u][v] = 0;
        }
        printf("Case %d: %d\n", icase++, ln+rn-match());
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值