The Accomodation of Students

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3565    Accepted Submission(s): 1659

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(1<n<=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
 
Source

题意: 有n个人,m条关系,问通过这些关系判断,所有人是否可以分成两个组,如果可以則求出一组最多多少人。

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <climits>
#include <queue>
#define ll long long using namespace std; const int N = ;
int head[N],total,visit[N];
int link[N],color[]; struct nodes
{
int e,next;
} Edge[N]; void add(int x,int y)//加边,邻接表形式建图
{
Edge[total].e = y;
Edge[total].next = head[x];
head[x] = total++;
} int dfs(int f) //匈牙利算法中的二分匹配dfs实现
{
for(int i = head[f]; i != -; i = Edge[i].next)//邻接表遍历与起始点f相连的所有点
{
int s = Edge[i].e; //与起始点相连的点
if(visit[s]) continue;//访问过就跳过
visit[s] = ;
if(link[s] == - || dfs(link[s]))//寻找增广路径
{
link[s] = f ;
return ;
}
}
return ;
} void init()//初始化
{
total = ;
memset(head,-,sizeof(head));
memset(link,-,sizeof(link));
}
bool bcolor(int u,int x)
{
if(color[u] != -)//如果从上个点出发过来,发现该点已染色
{
if(color[u] == x)//如果此点颜色与邻点相同
return false; //不是二分图,返回染色失败
}
else
{
color[u] = x^;//该点未染色,則染与上个点不同的颜色
for(int i = head[u]; i != -; i = Edge[i].next)//遍历与该点相连的所有边
{
if(!bcolor(Edge[i].e,color[u]))//如果下一层染色失败,則返回失败
return false;
}
}
return true;
}
bool judge(int n)
{
memset(color,-,sizeof(color));//先初始化所有点为-1,代表未染色
for(int i = ; i <= n; i++)//依次检查点是否染过色
{
if(color[i] == -)//若没访问过,則开始填色
{
if(!bcolor(i,))
return false;
}
}
return true;
}
int main(void)
{
int n,i,cnt,m;
while(scanf("%d",&n) != -)
{
init();
scanf("%d",&m);
for(i = ; i < m; i++)
{
int x,y;
scanf("%d %d",&x,&y);
add(x,y);
//add(y,x);
}
if(!judge(n)) // 判断是否为二分图
{
printf("No\n");
}
else //匈牙利算法
{
for(cnt = ,i = ; i <= n; i++)
{
memset(visit,,sizeof(visit));
if(dfs(i))
cnt++;
}
printf("%d\n",cnt);//若建的双向边則最大匹配数统计了两次,因为是双向的,所以需除以2 ;若建的单向边,則不需要除以2.
} }
return ;
}

hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)的更多相关文章

  1. HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...

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

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

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

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

  4. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

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

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

  6. 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...

  7. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)

    [题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...

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

    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. java笔试之数字颠倒

    描述: 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001 package test; import java.ut ...

  2. 新手redis集群搭建

    redis集群搭建在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件:进入到解压缩后的redis文件目录(此时可以看到Makefile文 ...

  3. Mahout In Action-第一章:初识Mahout

    1. 初识Mahout 本章涵盖以下内容: Apache Mahout是什么? 现实中推荐系统引擎.聚类.分类概述 配置mahout 读者可能从本书的标题中猜测到,本书是一本讲解如何将mahout应用 ...

  4. 全面解析Spring中@ModelAttribute注解的用法

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...

  5. JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)

    题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N≤200N \leq 200N ...

  6. C++和G++手工开栈的=_=

    微软的编译器(C++) #pragma comment(linker, "/STACK:102400000,102400000") G++ << ; // 256MB ...

  7. 基于Skyline与ArcGIS Server的二三维联动功能实现

    基于Skyline与ArcGIS Server的二三维联动功能实现主要利用WEB技术.ArcGIS for JavaScript.Skyline 二次开发以及ArcGIS 10.1 桌面工具. 利用A ...

  8. 63 搜索旋转排序数组II

    原题网址:https://www.lintcode.com/problem/search-in-rotated-sorted-array-ii/description 描述 跟进“搜索旋转排序数组”, ...

  9. PAT甲级——A1050 String Subtraction

    Given two strings S​1​​ and S​2​​, S=S​1​​−S​2​​ is defined to be the remaining string after taking ...

  10. scrapy中的Request和Response对象

    前言: 如果框架中的组件比做成是人的各个器官的话,那个Request和Response就是血液,Item就是代谢产物 Request对象: 是用来描述一个HTTP请求,其构造参数有 url 请求的UR ...