博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2444——The Accomodation of Students(判断二分图+匈牙利算法)
阅读量:2344 次
发布时间:2019-05-10

本文共 2108 字,大约阅读时间需要 7 分钟。

Problem Description

There are a group of students. Some of them may know each other, while others don’t. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other.

Now you are given all pairs of students who know each other. Your task is to divide the students into two groups so that any two students in the same group don’t know each other.If this goal can be achieved, then arrange them into double rooms. Remember, only paris appearing in the previous given set can live in the same room, which means only known students can live in the same room.

Calculate the maximum number of pairs that can be arranged into these double rooms.

Input

For each data set:
The first line gives two integers, n and m(1n<=200), indicating there are n students and m pairs of students who know each other. The next m lines give such pairs.

Proceed to the end of file.

Output

If these students cannot be divided into two groups, print “No”. Otherwise, print the maximum number of pairs that can be arranged in those rooms.

Sample Input

4 4
1 2
1 3
1 4
2 3
6 5
1 2
1 3
1 4
2 5
3 6

Sample Output

No
3

给定m对人,他们互相认识,求这些人能不能成为二分图?如果能,求最大匹配

用BFS判断二分图,将每对点分为0或1,如果所有点对都满足这个规律,那就是二分图,然后再用匈牙利算法,因为是求多少对人,所以最后要除以2

#include 
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#define INF 0x3f3f3f3f#define MAXN 205#define Mod 10001using namespace std;bool vis[MAXN];int n,m;int mp[MAXN][MAXN],pre[MAXN]; //匹配路径;int find(int cur){ for(int i=1; i<=n; ++i) { if(!vis[i]&&mp[cur][i]) { vis[i] = true; if(pre[i] == 0 || find(pre[i])) { pre[i]=cur; return 1; } } } return 0;}int judge[MAXN];bool bfs(){ memset(judge,-1,sizeof(judge)); queue
q; q.push(1); judge[1]=0; while(!q.empty()) { int v=q.front(); q.pop(); for(int i=1;i<=n;++i) { if(mp[v][i]) { if(judge[i]==-1) { judge[i]=(judge[v]+1)%2; q.push(i); } else { if(judge[i]==judge[v]) return false; } } } } return true;}int main(){ while(~scanf("%d%d",&n,&m)) { memset(mp,0,sizeof(mp)); memset(pre,0,sizeof(pre)); int a,b; for(int i=0;i

转载地址:http://svcvb.baihongyu.com/

你可能感兴趣的文章
Git 简单常规使用
查看>>
JAVA POI导出带动态下拉框EXCEL模板
查看>>
IDEA 创建多模块MAVEN SpringBoot项目
查看>>
Mysql导入SQL语句报错:The used table type doesn‘t support FULLTEXT indexes
查看>>
NPM 替代产品Yarn的安装和使用
查看>>
JAVA 注解反射 过滤修改对象值
查看>>
SVN Working Copy Locked 解决方法
查看>>
Java Spring Cloud Gateway 和Zull 对比
查看>>
Spring Cloud Gateway 微服务系统使用swagger-bootstrap-ui生成接口文档
查看>>
Mysql 单表联合更新
查看>>
Mybatis Plus 逻辑删除理论与实践
查看>>
Java Hutool 汉字转拼音码
查看>>
Java后端限制频繁请求、重复提交
查看>>
Java Request 获取请求method,请求param,请求body
查看>>
Mybatis plus 多数据源切换
查看>>
极速搭建一个FTP服务器
查看>>
Java Ftp 文件操作
查看>>
Windows 简单安装配置Redis
查看>>
Mybatis Plus 逆向生成实体类、实现类、控制层
查看>>
IDEA解除SVN关联
查看>>