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 ( ...
随机推荐
- vc读取当前路径和读取配置ini文件
//获取路径 std::string GetApplicationDir() { HMODULE hModule = GetModuleHandleW(NULL); WCHAR wpath[MAX_P ...
- can协议
Controller Area Network,是一种用于实时应用的串行通讯协议总线. CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任一时刻,总线上有2种电平 ...
- Javascript中call、apply之我见
一.call和apply定义. 1.Call 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg ...
- GankApp 侧滑和title修改颜色的完整项目app
GankApp 侧滑和title修改颜色的完整项目app GankApp 侧滑和title修改颜色的完整项目app,本项目主要由侧滑框架和4.4以及以上的头部title颜色调整和, 首页viewpag ...
- 实现了一下Mp3播放器的功能
实现了一下Mp3播放器的功能 简单的实现了一下Mp3播放器的功能,见面比较的不美好,讲 究看一下就好了. 主要功能: 1.显示文件列表,主要参照了一位前辈的代码,谢咯. 2.可以实现播放开始,暂停. ...
- linux下卸载自带的JDK和安装想要的JDK
卸载 1.卸载用 bin文件安装的JDK方法: 删除/usr/java目录下的所有东西 2.卸载系统自带的jdk版本方法: 查看自带的jdk: #rpm -qa | grep gcj 看到如 ...
- vue样式绑定
vue 绑定class 和style 有相同的地方,可以是数组和对象,对于class class是真实的在css样式中添加的,只不过在元素中添加需要:class这样代表绑定,然后这个class作为对象 ...
- js判断是否为undefined
typeof(isadmin)=="undefined"需要使用typeof才能判断
- 搭建ssm环境
在eclipse下搭建ssm框架. 1.新建maven项目. 2.添加jar包依赖 3.修改web.xml配置文件 <?xml version="1.0" encoding= ...
- c3p0的几种使用方式(原文地址: https://my.oschina.net/liangtee/blog/101047)
package com.c3p0.test; import java.sql.Connection; import java.sql.SQLException; import java.beans.P ...