题意

首先判断所有的人可不可以分成两部分,每部分内的所有人都相互不认识。如果可以分成 则求两部分最多相互认识的对数。

解题

类似分成两组,同组互不相关,就可能使判断是否为二分图

能否分成两部分 则是判断是否是一个二分图。
无向图G为二分图的充分必要条件是:G至少有两个顶点,且当存在回路时,其所有回路的长度均为偶数。回路就是环路,也就是判断是否存在奇数环。
判断二分图方法:用染色法,把图中的点染成黑色和白色。
首先取一个点染成白色,然后将其相邻的点染成黑色,如果发现有相邻且同色的点,那么就退出,可知这个图并非二分图。

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
int map[][],vist[],match[],n;
int find(int i)
{
for(int j=;j<=n;j++)
if(!vist[j]&&map[i][j])
{
vist[j]=;
if(match[j]==||find(match[j]))
{
match[j]=i; return ;
}
}
return ;
}
int isTwo()//判断是否为二分图
{
queue<int>q;
memset(vist,,sizeof(vist));
q.push(); vist[]=;
while(!q.empty())
{
int p=q.front(); q.pop();
for(int j=;j<=n;j++)
if(map[p][j])
{
if(vist[j]==)
{
if(vist[p]==)vist[j]=;else vist[j]=;
q.push(j);
}
else if(vist[j]==vist[p])
return ;
}
}
return ;
}
int main()
{
int m,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,,sizeof(map));
while(m--)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=;
}
if(!isTwo()||n==)
{
printf("No\n"); continue;
}
memset(match,,sizeof(match));
int ans=;
for(int i=;i<=n;i++)
{
memset(vist,,sizeof(vist));
ans+=find(i);
}
printf("%d\n",ans/);//除2是因为对称,1认识2 与 2认识1 属同一情况
}
}

hdu2444The Accomodation of Students (最大匹配+判断是否为二分图)的更多相关文章

  1. hdu2444The Accomodation of Students (最大匹配+推断是否为二分图)

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

  2. The Accomodation of Students(判断二分图以及求二分图最大匹配)

    The Accomodation of Students Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  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 2444 The Accomodation of Students(判断是否可图 + 二分图)

    题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识.现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组, 住在一个双人房里.相互认识的同学可以住在一个 ...

  5. hdu2444The Accomodation of Students

    思路: 二分图判断+最大匹配模板 二分图判断的方法很好想,没有离散的基础凭空给你个图让你判断也很容易想到染色法,简单的介绍下就是用queue来做,标记一个点为x则他所有的邻点都为x',然后递归的执行下 ...

  6. HDU-2444-The Accomodation of Students(二分图判定,最大匹配)

    链接: https://vjudge.net/problem/HDU-2444#author=634579757 题意: There are a group of students. Some of ...

  7. HDU 2444 The Accomodation of Students(推断是否是二分图)

    题目链接 题意:n个学生,m对关系,每一对互相认识的能住一个房间.问否把这些学生分成两组,要求每组的学生都互不认识.求最多须要多少个房间. 能否分成两组?也就是说推断是不是二分图,推断二分图的办法,用 ...

  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 判断是否构成二分图 + 最大匹配

    此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足 ...

随机推荐

  1. maven web项目的web.xml报错The markup in the document following the root element must be well-formed.

    maven项目里面的web.xml开头约束是这样的 <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  2. RocketMQ存储系统概要设计和源码解读

    普遍消息存储技术的选型 分布式KV存储 NewSQL存储:TiDB 文件系统:RocketMQ,kafka,RabbitMQ RocketMQ:所有的message存储在一个log里,不区分topic ...

  3. DS博客作业8——课程总结

    1.当初你是如何做出选择计算机专业的决定的? 本来我在集美大学第一志愿专业是理学院的数据科学与大数据,奈何隔壁县城小伙伴比我高了2分,我就来到了网络,但经过我和她的交流,我意识到我们的课程差不多,同样 ...

  4. python dict字典添加元素

    已存在的字典进行赋值操作 可为该字典添加新元素例子:a = {‘age’: 23, ‘name’: ‘lala}a[school] = ‘nanhaizhongxue’print a>>& ...

  5. webSocket通信

    针对webSocket通信总结: 1.webSocket通信原理图: 2.webSocket通信实例 参考地址1:https://www.cnblogs.com/cjm123/p/9674506.ht ...

  6. Uep查询语句总结

    今天没事干总结一下uep查询语句: 第一种方法: 注意在实体写上对应的构造方法 package com.haiyisoft.entity.wz; import java.math.BigDecimal ...

  7. 五一 DAY 7

    五一  DAY 7 P1514 引水入城 P1311 选择客栈 题解: P1315 观光公交 题解: 设 wait i 为最晚到达的旅客 arrive i 为到达i 的时刻 arrive i =max ...

  8. Boston House Price with Scikit-Learn

    Boston House Price with Scikit-Learn Data Description >>> from sklearn.datasets import load ...

  9. Anaconda 32在windows下安装gensim

    安装Anaconda 2.4以后运行corpora.MmCorpus.serialize的时候出错 换了Anaconda 2.1以后没问题了 原因:Anaconda 2.4的numpy是1.10.1版 ...

  10. 学习笔记 - Git

    学习参考网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git是目前世界上 ...