POJ1426 最小独立点集

本文讨论了如何利用二分图解决最大匹配问题,包括最小独立点集的概念及其与最小点覆盖的关系,通过实例展示了求解过程,并提供了算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题就是说一堆人有男有女....有些男女之间会有好感(romantically involved .... 有基佬吐槽男男之间也能有好感...无视!!这题就是男的对女的才有...也就是图就是个二分图...)...有好感的男女不能分在一起....问最后能分在一起的人数最多是多少..

这道题一看就想到二分图...但我就是因为对最小独立点集的性质以及与最小点覆盖的关系不清楚...导致卡了蛮久...后来去找了资料才明白...最小独立点集 = 顶点数 - 最小点覆盖数...又最小点覆盖 = 最大匹配数...so...

最小独立点集 = 顶点数 - 最大匹配数

#include<iostream> #define MAXN 510 using namespace std; int n,match[MAXN]; bool map[MAXN][MAXN],used[MAXN]; int input() { int data=0; char c; while (c<'0' || c>'9') c=getchar(); while (c>='0' && c<='9') { data=data*10+c-'0'; c=getchar(); } return data; } bool ok(int num) { int i; for (i=0;i<n;i++) if (!used[i] && map[num][i]) { used[i]=true; if (match[i]==-1 || ok(match[i]) ) { match[i]=num; return true; } } return false; } int main() { while (~scanf("%d",&n)) { int i,h,p,k; memset(map,false,sizeof(map)); for (i=0;i<n;i++) { h=input(); k=input(); while (k--) { p=input(); map[h][p]=true; } } memset(match,-1,sizeof(match)); k=0; for (i=0;i<n;i++) { memset(used,false,sizeof(used)); if (ok(i)) k++; } printf("%d\n",(2*n-k)/2); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值