用染色法判断二分图是这样进行的,随便选择一个点,

1.把它染成黑色,然后将它相邻的点染成白色,然后入队列

2.出队列,与这个点相邻的点染成相反的颜色

根据二分图的特性,相同集合内的点颜色是相同的,即

但是如果这个图不是二分图,那么就会这样

把与1相邻的点2,3染成白色,然后入队列,然后2出队列,要把与2相邻的点2,3染成黑色,但是都染过了,所以不用染色

但是3的颜色应该与2相反(如果是二分图的话),可是没有相反,所以就不是二分图

 #include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
const int N = ;
struct Edge
{
int v,next;
}g[N*N];
int first[N*N];
int color[N*N];
int cy[N];
bool vis[N];
int e;
int n,m;
bool is_ ;
void addEdge(int a, int b)
{
g[e].v = b;
g[e].next =first[a];
first[a] = e++;
}
bool bfs(int cur)//染色法,判断是否是二分图
{//时间复杂度 邻居矩阵O(n*n) 邻接表 O(n+e)
queue<int> q;
q.push(cur);
color[cur] = ;
while(!q.empty())
{
cur = q.front();q.pop();
for(int i=first[cur]; i!=-; i=g[i].next)
{
int v = g[i].v;
if(color[v] == -)
{
color[v] = - color[cur];
q.push(v);
} if(color[v] == color[cur])
return false;
}
}
return true;
}
void dfs_color(int cur)
{
for(int i=first[cur]; i!=-; i=g[i].next)
{
int v = g[i].v;
if(color[v] == -)
{
color[v] = - color[cur];
dfs_color(v);
}
else if(color[v] == color[cur])
is_ = false; } }
bool dfs(int cur)
{
for(int i=first[cur]; i!=-; i=g[i].next)
{
int v = g[i].v;
if(!vis[v])
{
vis[v] = true;
if(cy[v]==- || dfs(cy[v]))
{
cy[v] = cur;
return true;
}
}
}
return false;
}
int Match()
{
int ans = ;
memset(cy, -, sizeof(cy));
for(int i=; i<=n; ++i)
{
memset(vis, , sizeof(vis));
ans += dfs(i);
}
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
int a,b,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(first, -, sizeof(first));
e = ;
for(i=; i<m; ++i)
{
scanf("%d%d",&a,&b);
addEdge(a,b);
addEdge(b,a);
}
is_ = true;
memset(color, -, sizeof(color));
for(i=; i<=n; ++i)
{
if(color[i] == -)
{
color[i] = ;
dfs_color(i);
}
}
if(!is_)
puts("No");
else
{
printf("%d\n",Match()/);//没有把集合x,y分开,所以相当有2个最大匹配
}
}
}

染色法判断是否是二分图 hdu2444的更多相关文章

  1. Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...

  2. Catch---hdu3478(染色法判断是否含有奇环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问 ...

  3. hdu 2444(染色法判断二分图+最大匹配)

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

  4. 【交叉染色法判断二分图】Claw Decomposition UVA - 11396

    题目链接:https://cn.vjudge.net/contest/209473#problem/C 先谈一下二分图相关: 一个图是二分图的充分必要条件: 该图对应无向图的所有回路必定是偶环(构成该 ...

  5. poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图

    http://blog.csdn.net/lyy289065406/article/details/6756821 http://www.cnblogs.com/wuyiqi/archive/2011 ...

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

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

  7. HDU2444(判断是否为二分图,求最大匹配)

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

  8. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

  9. hdu 2444 The Accomodation of Students 判断是否构成二分图 + 最大匹配

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

随机推荐

  1. 两道二分coming~

    第一道:poj 1905Expanding Rods 题意:两道墙(距离L)之间架一根棒子,棒子受热会变长,弯曲,长度变化满足公式( s=(1+n*C)*L),求的是弯曲的高度h. 首先来看这个图: ...

  2. 3xian退役贴【深思。】

    这是原文: 最后一天,漫天飘起了雪花,假装欢送我离去. 这次WF之战不太顺利,早期的C题大概花了1秒钟构思,然而由于输出格式多了一个空格直到两个半小时才逃脱Wrong Answer的纠缠.还好lynn ...

  3. skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程

    学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue ...

  4. 给工程师的 10 条哲理(浅薄者迷信运气,强者相信因果,软件复制成本为零,文凭不重要,AWS使得创业成本为零,每个手机都是口袋里的强大电脑)

    无论是主题分布式数据库,微服务,Soylent,尤伯杯,或者矮人要塞,我们试图从物质分离出来炒作,推迟叙事的客人.与尊重有软件工程日报的社论部分客观性. 一位渠道的成员说,“当软件工程每日的意见公布, ...

  5. [Windows Phone]模仿魔兽3技能按钮SkillButton

    简介: 模仿魔兽3技能按钮,带CD效果.使用的时候可以当做普通按钮使用,同时也支持Binding. 音效紧耦合在控件内部,因为控件本身目的就是模拟魔兽3的技能按钮,所以不考虑音效的扩展. Demo结构 ...

  6. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。

    对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...

  7. iphone开发中数据持久化之——模型对象归档(二)

    在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...

  8. Android NDK入门实例 计算斐波那契数列二生成.so库文件

    上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...

  9. VBoxGuestAdditions.iso下载地址

    http://download.virtualbox.org/virtualbox/4.1.2/VBoxGuestAdditions_4.1.2.iso 其它版本号可依次判断..

  10. [置顶] Guava学习之Multimap

    相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的.什么意思呢?就是假如我们有 ...