题意:

  有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No。若能,则继续。在两组中挑两个认识的人(每组各1人)到一个双人房。输出需要多少个双人房?

思路:

  先判定是否为二分图,可以用黑白着色法(DFS或BFS都行)。若是二分图,再进行匹配,用匈牙利算法,注:给的是整个图,没有区分男女,用邻接表比较好。

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
vector< vector<int> > vect;
int col[N];
int girl[N];
int vis[N];
int n, m; bool color(const int x) //x可达的点着色
{
for(int i=; i<vect[x].size(); i++)
{
int t=vect[x][i];
if(col[x]==col[t]) return false; //出错了,同色
if(!col[t])
{
col[t]=-col[x];//性别标为1和2
if(color(t)==false) return false; //只有刚着色的才需要深搜
}
}
return true; //只有单个点才会到这
} bool is2()//二分图判断,注意其可能并不是个连通图
{
memset(col,,sizeof(col));
for(int i=; i<=n; i++) //黑白着色
{
if(!col[i]) //可能有多个连通分量
{
col[i]=;
if(!color(i))
{
//cout<<i<<endl;
return false;
}
}
}
return true;
} int find(int x)
{
for(int i=; i<vect[x].size(); i++)
{
int t=vect[x][i];
if(!vis[t])
{
vis[t]=;
if(!girl[t] || find(girl[t])) //未匹配,或能为其对象另匹配
{
girl[t]=x;
return true;
}
}
}
return false;
} int hungary()
{
int cnt=;
memset(girl,,sizeof(girl));
for(int i=; i<=n; i++)
{
memset(vis,,sizeof(vis));
if(find(i)) cnt++;
}
return cnt;
} int main()
{
//freopen("input.txt", "r", stdin);
int a, b, c;
while(cin>>n>>m)
{
vect.clear();
vector<int> tmp;
for(int i=; i<=n; i++) vect.push_back(tmp);//切忌用resize,会惨死在这 for(int i=; i<m; i++)
{
scanf("%d%d",&a,&b);
vect[a].push_back(b);
vect[b].push_back(a);
}
if(!is2()&& (puts("No"),) ) continue; //仅仅为了少一行代码
printf("%d\n",hungary()>>); //二分图匹配,匈牙利
}
return ;
}

AC代码

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(二分匹配 匈牙利算法 邻接表实现)

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

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

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

  4. HDU 2444 The Accomodation of Students二分图判定和匈牙利算法

    本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配. 究竟怎样学习一种新算法呢? 我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己 ...

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

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

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

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

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

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

  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 StudentsTime Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

随机推荐

  1. JavaScript高级---组合模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  2. uva 11627

    二分 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #inc ...

  3. Java学习第七篇:与运行环境交互

    目录 一.与用户互动 1.main方法形参 2.使用Scanner类获取输入 3.使用BufferedReader类获取输入 二.常用类 1.System类和Runtime类 2.String, St ...

  4. Lua 的数据结构

    1. Arrays: 注意 #(data), # 加上 table名字 == size of data = {}; , do --行 , do --列 data[(y-)*+x] = (y-)*+x; ...

  5. POJ 1702

    #include <iostream> #include <cmath> #define MAXN 100 using namespace std; void fun(int ...

  6. JavaScript 隐式转换

    javascript 中的怪癖,js运算符隐式类型转换 x + "" //等价于 String(x) + x //等价于 Number(x),也可以写成x-0 !!x //等价于 ...

  7. hdu 4704 Sum

    思路:对于给定的n,s(i)即将n分解为i个数的组合数,也就是在n-1个位置插入i-1个板即C(n-1,i-1); ∑S=2^(n-1); phi(1000000007)=1000000006; 对于 ...

  8. 2013 Multi-University Training Contest 2 Balls Rearrangement

    先算出lcm(a,b),如果lcm>=n,则直接暴力解决:否则分段,求出0-lcm内的+0-n%lcm内的值. 再就是连续相同的一起计算!! #include<iostream> # ...

  9. [hackerrank]Palindrome Index

    简单题. #include <iostream> #include <string> using namespace std; int main() { int T; cin ...

  10. 用React.addons.TestUtils、Jasmine进行单元测试

    一.用到的工具 1.React.addons.TestUtils 2.Jasmine 3.Browserify(处理jsx文件的require依赖关系) 4.Reactify(能和browserify ...