HDU-2444-The Accomodation of Students(bfs染色判定是否为二分图+最大匹配)

该博客讨论了一个学生住宿分配问题,其中学生分为互相认识和不认识两类。目标是将他们分成两组,使得同一组内的学生互不认识,并最大化双人间的配对数量。博主提出了使用bfs染色来判断图是否为二分图,并结合最大匹配方法解决此问题。博客内容涵盖输入输出格式说明及算法思路解析。

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

题目

问题描述

有一群学生。他们中的一些人可能互相认识,而另一些人则不认识。例如,A和B互相认识,B和C互相认识。但这并不意味着A和C相互认识。
现在给你们所有互相认识的学生。你的任务是把学生分成两组,这样同一组的任何两个学生都不认识对方。如果这个目标可以实现,那就把他们安排在双人间。只有认识的学生才能住在同一个房间里。
计算可以安排到这些双人间的最大对数。

输入

对于每个数据集:
第一行给出两个整数n和m。接下来的m行给出这样的对。

输出

如果这些学生不能分成两组,请打印“否”。否则,打印在这些房间中可以安排的最大对。

bfs染色判定是否为二分图+最大匹配

#include<queue>
#include<cstdio>
#include<cstring>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
const int N=200+5;
int head[N],mt[N];
int col[N],tot;
struct Edge{int to,nex;}edge[N*N/2];
void add(int from,int to)
{
    edge[++tot]=(Edge){to,head[from]};head[from]=tot;
}
queue<int>q;
int istwo()
{
    while(!q.empty()) q.pop();
    m(col,0);col[1]=1,q.push(1);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(int i=head[x];i;i=edge[i].nex)
        {
            int y=edge[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值