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的更多相关文章

  1. HDU 2444:The Accomodation of Students(二分图判定+匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...

  2. The Accomodation of Students HDU - 2444 二分图判定 + 二分图最大匹配 即二分图-安排房间

    /*655.二分图-安排房间 (10分)C时间限制:3000 毫秒 |  C内存限制:3000 Kb题目内容: 有一群学生,他们之间有的认识有的不认识.现在要求把学生分成2组,其中同一个组的人相互不认 ...

  3. hdu 2444 二分图判断与最大匹配

    题意:有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识.如果可以分成两部分,就算出房间最多需要多少间,否则就输出No ...

  4. HDU 2444 二分图判断 (BFS染色)+【匈牙利】

    <题目链接> 题目大意: 有N个人,M组互相认识关系互相认识的两人分别为a,b,将所有人划分为两组,使同一组内任何两人互不认识,之后将两个组中互相认识的人安排在一个房间,如果出现单人的情况 ...

  5. HDU - 2444 二分图最大匹配 之 判断二分图+匈牙利算法

    题意:第一行给出数字n个学生,m条关系,关系表示a与b认识,判断给定数据是否可以构成二分图,如果可以,要两个互相认识的人住一个房间,问最大匹配数(也就是房间需要的最小数量) 思路:要看是否可以构成二分 ...

  6. hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS     Me ...

  7. HDU 2444 The Accomodation of Students 二分图判定+最大匹配

    题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...

  8. The Accomodation of Students HDU - 2444(判断二分图 + 二分匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  9. hdu 2444 The Accomodation of Students 判断二分图+二分匹配

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

随机推荐

  1. 传输层——TCP报文头介绍

    16位源端口号 16位目的端口号 32位序列号 32位确认序列号 4位头部长度 保留6位 U R G A C K P S H R S T S Y N F I N 16位窗口大小 16位检验和 16位紧 ...

  2. 安装mysql 初始化的时候报错 Can't find file: './mysql/db.frm' (errno: 13) ERROR: 1017

    目录下没有权限 需要权限

  3. Html写作规范

    HTML是描述网页结构的超文本标记语言,HTML规范能够使HTML代码风格保持一致,使得HTML更容易理解和维护. 整体结构 用编辑器快捷键一键搞定 <!DOCTYPE html>---- ...

  4. JS-事件对象(鼠标键盘事件)

    一  事件对象 1 需要获取键盘和鼠标的信息的时候,用到事件对象.(e) 例如:document.onclick = function(e){ var  e = e || event;(做兼容) } ...

  5. linux下面设置密码失效参考

    chage -E 2005-12-31 user1 设置用户口令的失效期限

  6. 《深入理解java虚拟机》笔记

    二.java内存区域与内存溢出异常 0.在内存管理领域,java与c/c++不同的是,在java虚拟机自动内存管理机制下,java不需要手动去为对象写配对的free内存的代码,不容易出现内存泄漏和内存 ...

  7. laravel框架目录结构详解

  8. leetcode 443. String Compression

    下面反向遍历,还是正向好. void left(vector<char>& v, bool p(int)) { ; ; ; while (del < max_index) { ...

  9. python:django

    ====启动django==== python manager.py runserver --host 0.0.0.0 --port 9008 python manager.py runserver ...

  10. RSA加密原理使用方式签名验证

      RSA加密原理使用方式签名验证 加密是网络传输中非常重要的一环,它保证了信息的安全性,让他人无法通过抓包来获取通讯的信息也无法通过伪造信息而实现对系统的入侵.其中最为常用的信息传递加密方式就是RS ...