首页 >> 大全

poj 2771 Guardian of Decency(最大独立数)

2024-01-02 大全 38 作者:考证青年

题意:人与人之间满足4个条件之一即不能成为一对(也就说这4个条件都不满足才能成为一对),求可能的最多的单身人数。

思路:把男女分为两部分,接下来就是二分图的匹配问题。把能成为一对的之间连边,然后求出最大匹配。题目要求的是最大独立数。

poj 2771 Guardian of Decency(最大独立数)__独立数是什么

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

#include
#include
#include<string.h>
#include
using namespace std;#define MAXN 1024struct person{int h;char music[105];char sport[105];
}male[MAXN],female[MAXN];int n,m,k,x,y,pre[MAXN];
//二分图中X集和Y集的节点数各为n、m,边数为k;匹配边集为pre,其中节点i所在的匹配边为(pre[i],i)
bool v[MAXN],a[MAXN][MAXN];
//设二分图相邻矩阵为a,Y集合中节点的访问标志为v,若Y集合中的节点j已访问,则v[j]=truebool dfs(int i){//判断以X集合中的节点i为起点的增广路径是否存在int j;for(j=0; j){if(!v[j]&&a[i][j]){//搜索所有与i相邻的未访问点v[j]=1;//访问节点jif(pre[j]==-1||dfs(pre[j])){//若j的前驱是未盖点或者存在由j的前驱出发的增广路径,则设定(i,j)为匹配边,返回成功标志pre[j]=i;return true;}}}return false;//返回失败标志
}int main(){int t,num,h;char sex[2];int i,j,ans;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));//二分图的相邻矩阵初始化memset(pre,-1,sizeof(pre));//匹配边集初始化为空n=m=0;scanf("%d",&num);while(num--){scanf("%d%s",&h,sex);if(sex[0]=='M'){male[n].h=h;scanf("%s%s",male[n].music,male[n].sport);++n;}else{female[m].h=h;scanf("%s%s",female[m].music,female[m].sport);++m;}}for(i=0;ii){for(j=0;jj){if(abs(male[i].h-female[j].h)<=40&&strcmp(male[i].music,female[j].music)==0&&strcmp(male[i].sport,female[j].sport)!=0)a[i][j]=1;}}ans=0;//匹配边数初始化为0for(i=0; i//枚举X集的每个节点memset(v,0,sizeof(v));//设Y集合中的所有节点的未访问标志if(dfs(i)) ans++;//若节点i被匹配边覆盖,则匹配边数+1
        }printf("%d\n",n+m-ans);}return 0;
}

View Code

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了