【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444
【DFS染色】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm> using namespace std;
const int maxn=2e2+;
const int maxm=maxn*maxn;
struct edge
{
int to;
int nxt;
}e[maxm];
int tot;
int head[maxn];
int col[maxn];
bool vis[maxn];
int link[maxn];
void init()
{
tot=;
memset(head,-,sizeof(head));
memset(col,,sizeof(col));
memset(link,-,sizeof(link));
} void add(int u,int v)
{
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot++;
}
bool Color(int u)
{
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
if(!col[v])
{
col[v]=!col[u];
if(!Color(v))
{
return false;
}
}
else if(col[v]==col[u])
{
return false;
}
}
return true;
}
bool find(int u)
{
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
if(!vis[v])
{
vis[v]=true;
if(link[v]==-||find(link[v]))
{
link[v]=u;
return true;
}
}
}
return false;
}
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
col[]=;
if(!Color())
{
puts("No");
continue;
}
int ans=;
for(int i=;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(find(i))
{
ans++;
}
}
printf("%d\n",ans/);
}
return ;
}
【BFS染色】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=2e2+;
const int maxm=maxn*maxn;
struct edge
{
int to;
int nxt;
}e[maxm];
int tot;
int head[maxn];
int col[maxn];
bool vis[maxn];
int link[maxn];
void init()
{
tot=;
memset(head,-,sizeof(head));
memset(col,,sizeof(col));
memset(link,-,sizeof(link));
} void add(int u,int v)
{
e[tot].to=v;
e[tot].nxt=head[u];
head[u]=tot++;
}
bool Color(int u)
{
queue<int> Q;
Q.push(u);
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
if(!col[v])
{
col[v]=!col[u];
Q.push(v);
}
else if(col[v]==col[u])
{
return false;
}
}
}
return true;
}
bool find(int u)
{
for(int i=head[u];i!=-;i=e[i].nxt)
{
int v=e[i].to;
if(!vis[v])
{
vis[v]=true;
if(link[v]==-||find(link[v]))
{
link[v]=u;
return true;
}
}
}
return false;
}
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
col[]=;
if(!Color())
{
puts("No");
continue;
}
int ans=;
for(int i=;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if(find(i))
{
ans++;
}
}
printf("%d\n",ans/);
}
return ;
}
匈牙利算法:
http://www.cnblogs.com/itcsl/p/6741020.html
【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students的更多相关文章
- 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)
如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...
- hdu 2444 The Accomodation of Students(二分匹配 匈牙利算法 邻接表实现)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- (二分匹配“匈牙利算法”)无题II --HDU --2236
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2236 代码: #include<cstdio> #include<cstring> ...
- HDU-3729 二分匹配 匈牙利算法
题目大意:学生给出其成绩区间,但可能出现矛盾情况,找出合理组合使没有说谎的人尽可能多,并按maximum lexicographic规则输出组合. //用学生去和成绩匹配,成绩区间就是学生可以匹配的成 ...
- hdu 2063 (二分匹配 匈牙利算法)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 染色法判断是否是二分图 hdu2444
用染色法判断二分图是这样进行的,随便选择一个点, 1.把它染成黑色,然后将它相邻的点染成白色,然后入队列 2.出队列,与这个点相邻的点染成相反的颜色 根据二分图的特性,相同集合内的点颜色是相同的,即 ...
随机推荐
- MyEclipse常用设置记录
MyEclipse版本:MyEclipse 2014 Blue版本. 设置内容: 1.内存优化 <MyEclipse_ROOT>/myeclipse-blue.ini文件 主要修改-vma ...
- AJPFX关于StringBuffer类的总结
StringBuffer类一.字符串缓冲区,是一个容器.没有子类不能继承.特点:长度可变化:可操作多个数据类型:可通过toString()变成字符串.二.存储方法1.StringBuffer appe ...
- P1440 求m区间内的最小值
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- vue组件中—bus总线事件回调函数多次执行的问题
在利用vue组件进行事件监听时发现,如果对N个vue组件实例的bus总线绑定同一事件的回调函数,触发任意组件的对应事件,回调函数至少会被执行N次,这是为什么呢? 为此,调研了普通对象的事件绑定和触发实 ...
- 实现上下全屏幕屏滚动效果js
---恢复内容开始--- 详情见代码 第一步:首先添加3个js文件: 1.http://cdn.staticfile.org/jquery/1.8.3/jquery.min.js 2.http://c ...
- 对openjdk的javac编译器扩展了一个语法糖
我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java ...
- 6 Specialzed layers 特殊层 第一部分 读书笔记
6 Specialzed layers 特殊层 第一部分 读书笔记 Specialization is a feature of every complex organization. 专注是 ...
- LigerUI用Post\Get\Ajax前后台交互方式的写法
parms 参数统一 json格式的数据 url 访问后台的url 设置同步参数 [javascript] view plain copy $.ajaxSetup({ async : false} ...
- Delphi win10 asssertion failure
Delphi2007 原来安装在Win7 下 运行正常, 自从升级到Win10 ,新建工程运行然后关闭报错, 报错信息如下: ---------------------------bds.exe - ...
- 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程
平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统 / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...