hdu 2444(二分图) The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444
大意是给定n个学生,他们之间可能互相认识,首先判断能不能将这些学生分为两组,使组内学生不认识;
现想将学生两两分组,且保证每一组的学生都认识,这样分组可达到的最大组数为多大?
判断二分图,然后求匈牙利算法求最大匹配数
染色法判断二分图(脑抽用vector跑的特别慢)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define M 300
vector<int>line[M];
int judge[M],p[M],q[M],used[M];
int n;
int find()
{
memset(q,,sizeof(q));
int start=,end=;
q[start]=;
memset(judge,-,sizeof(judge));
judge[]=;
while (start<end)
{
int w=q[start];
for (int i=;i<line[w].size();i++)
{
int e=line[w][i];
if (judge[e]==-){
judge[e]=(judge[w]+)%;
q[end++]=e;
}
else{
if (judge[e]==judge[w]) return ;
}
}
start++;
}
return ;
}
int sreach(int x)
{
int i,j;
for (j=;j<=n;j++){
for (i=;i<line[j].size();i++)
{
if (line[j][i]==x&&!used[j])
{
used[j]=;
if (!p[j]||sreach(p[j]))
{
p[j]=x;
return ;
}
}
}
}
return ;
}
int main()
{
int t,i,m,a,b;
while (~scanf("%d %d",&n,&m))
{
for (i=;i<=n;i++)
line[i].clear();
while (m--)
{
scanf("%d %d",&a,&b);
line[a].push_back(b);
line[b].push_back(a);
}
memset(p,,sizeof(p));
if (!find()){
printf("No\n");continue;
}
int ans=;
for (i=;i<=n;i++)
{
memset(used,,sizeof(used));
if (sreach(i)) ans++;
}
printf("%d\n",ans/);
}
return ;
}
关系并查集判断二分图,类似于hdu 1829
#include<cstdio>
#include<cstring>
using namespace std;
#define M 300
int father[M],line[M][M],used[M],p[M];
int n,rank[M];
void give()
{
for (int i=;i<=;i++){
father[i]=i;rank[i]=;
}
}
int find(int x)
{
if (x==father[x]) return father[x];
int t=find(father[x]);
rank[x]=(rank[x]+rank[father[x]])%;
father[x]=t;
return father[x];
}
int sreach(int x,int n)
{
int i;
for (i=;i<=n;i++)
{
if (line[i][x]&&!used[i])
{
used[i]=;
if (!p[i]||sreach(p[i],n))
{
p[i]=x;
return ;
}
}
}
return ;
}
int main()
{
int n,m,a,b,i;
while (~scanf("%d %d",&n,&m))
{
give();
int flag=;
memset(p,,sizeof(p));
memset(line,,sizeof(line));
while (m--)
{
scanf("%d %d",&a,&b);
line[a][b]=line[b][a]=;
int sx=find(a);
int sy=find(b);
if (sx!=sy) {
rank[sx]=(rank[a]+rank[b]+)%;
father[sx]=sy;
}
else {
if (rank[a]==rank[b]) flag=;
}
}
if (flag==){
printf("No\n");continue;
}
int ans=;
for (i=;i<=n;i++)
{
memset(used,,sizeof(used));
if (sreach(i,n)) ans++;
}
printf("%d\n",ans/);
}
return ;
}
hdu 2444(二分图) The Accomodation of Students的更多相关文章
- HDU 2444:The Accomodation of Students(二分图判定+匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...
- The Accomodation of Students HDU - 2444 二分图判定 + 二分图最大匹配 即二分图-安排房间
/*655.二分图-安排房间 (10分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容: 有一群学生,他们之间有的认识有的不认识.现在要求把学生分成2组,其中同一个组的人相互不认 ...
- hdu 2444 二分图判断与最大匹配
题意:有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识.如果可以分成两部分,就算出房间最多需要多少间,否则就输出No ...
- HDU 2444 二分图判断 (BFS染色)+【匈牙利】
<题目链接> 题目大意: 有N个人,M组互相认识关系互相认识的两人分别为a,b,将所有人划分为两组,使同一组内任何两人互不认识,之后将两个组中互相认识的人安排在一个房间,如果出现单人的情况 ...
- HDU - 2444 二分图最大匹配 之 判断二分图+匈牙利算法
题意:第一行给出数字n个学生,m条关系,关系表示a与b认识,判断给定数据是否可以构成二分图,如果可以,要两个互相认识的人住一个房间,问最大匹配数(也就是房间需要的最小数量) 思路:要看是否可以构成二分 ...
- hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)
http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS Me ...
- HDU 2444 The Accomodation of Students 二分图判定+最大匹配
题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...
- The Accomodation of Students HDU - 2444(判断二分图 + 二分匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu 2444 The Accomodation of Students 判断二分图+二分匹配
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
随机推荐
- eval解析字符串为JSON对象
对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次. 这种方式也适合以普通j ...
- 吴裕雄 21-MySQL 正则表达式
MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配.MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表 ...
- SPSS-生存分析
生存分析 定义:一些医学事件所经历的时间:从开始观察到事件发生的时间,不是短期内可以明确判断的.针对这类生存资料的分析方法叫生存分析.生存分析的基本概念1.终点事件终点事件outcome event: ...
- windows 激活venv问题
.\ven\Scripts\activate.\ven\Scripts\activate : 无法加载文件 D:\github\ven\Scripts\activate.ps1,因为在此系统上禁止运行 ...
- TF-IDF原理及使用
1.TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).(逆文档词频) 2.自我理解: 公式TF = $$\frac{语料库中关键词 ...
- spring boot springmvc视图
pring boot 在springmvc的视图解析器方面就默认集成了ContentNegotiatingViewResolver和BeanNameViewResolver,在视图引擎上就已经集成自动 ...
- Docker容器管理及代码调用
这篇文章主要讲解Docker的容器管理,实现服务的部署,以Redis为例.我用的是Utuntu16.04,所以软件直接从库中下载,库中的Docker不是最新版本.但是不影响部署,如需要最新可在官网下载 ...
- linux shell 学习笔记01
1.命令历史记录history !$ :调用上一条命令的执行结果 !100 :运行history记录里的第100条命令 !ser :调用以ser开头的最后一次执行的命令 ctrl+r ...
- reids 基本操作
redis 基本操作 1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dic ...
- IDEA中配置Maven+spring MVC+tomcat
一:配置Maven安装教程如下: http://blog.csdn.net/qq_32588349/article/details/51461182 实际安装过程中,如果按照教程配置如下属性,最后创建 ...