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 ( ...
随机推荐
- Python中的转换函数
https://www.cnblogs.com/wuxiangli/p/6046800.html python中的字符数字之间的转换函数 int(x [,base ]) 将x转换为 ...
- 对于“2017面向对象程序设计(Java)第五周工作总结”存在问题的反馈及本周教学计划
一:问题反馈 “上周我们学习的新内容主要是第五章,并对第四章内容做了巩固.从学生上交的实验报告完成情况以及学习Java心得博客中的反馈可以看出,学生对构造器.重载.超类.多态.抽象类这几个概念理解的不 ...
- 修改php.ini 的timezone
php运行模式有apache 和 cli模式 这里讲cli 模式的php.ini设置 1.查找php.ini位置 php -i | grep php.ini 这样是表示 要改的文件 在/etc/php ...
- linux安装mysql5.1
一.卸载mysql 1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除 # yum list installed | grep mysql mysql-libs.i686 ...
- BOM 对象--location、navigator、screen、history
1.location 对象 location提供了与当前窗口中加载的文档有关的信息,还有一些导航功能.需要注意的是,window.location 和 document.location 引用的是同一 ...
- javascript 执行环境,作用域、作用域链、闭包
1.执行环境 执行环境是JavaScript中国最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数 ...
- 字符串相似度算法(编辑距离Levenshtein Distance)的应用场景
应用场景 DNA分析: 将DNA的一级序列如β-球蛋白基因的第一个外显子(Exon)转化为分子“结构图”,然后由所得“结构图”提取图的不变量,如分子连接性指数.以图的不变量作为自变量,再由相似度计算公 ...
- Java 日期时间 Date类型,long类型,String类型表现形式的转换
Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); ...
- 第一次登录mysql,使用任何命令都报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
问题: 使用临时密码登录成功后,使用任何myql命令,例如show databases;都提示下面的报错 ERROR 1820 (HY000): You must reset your passwor ...
- PyCon大会Python主题演讲摘要
PyCon 是全国际最大的以 Python 编程言语 为主题的技能大会.大会由 Python 社区组织,每年举行一次.在大会上,来自国际各地的 Python 用户与中心开发者齐聚一堂,共同同享 Pyt ...