染色法判断是否是二分图 hdu2444
用染色法判断二分图是这样进行的,随便选择一个点,
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的更多相关文章
- Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...
- Catch---hdu3478(染色法判断是否含有奇环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问 ...
- hdu 2444(染色法判断二分图+最大匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 【交叉染色法判断二分图】Claw Decomposition UVA - 11396
题目链接:https://cn.vjudge.net/contest/209473#problem/C 先谈一下二分图相关: 一个图是二分图的充分必要条件: 该图对应无向图的所有回路必定是偶环(构成该 ...
- poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
http://blog.csdn.net/lyy289065406/article/details/6756821 http://www.cnblogs.com/wuyiqi/archive/2011 ...
- 【01染色法判断二分匹配+匈牙利算法求最大匹配】HDU The Accomodation of Students
http://acm.hdu.edu.cn/showproblem.php?pid=2444 [DFS染色] #include<iostream> #include<cstdio&g ...
- HDU2444(判断是否为二分图,求最大匹配)
The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
- hdu 2444 The Accomodation of Students 判断是否构成二分图 + 最大匹配
此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足 ...
随机推荐
- Please verify you invoked Maven from the correct directory
解决办法: 在cmd中,把当前路径转换到一个含有pom文件的 项目路径下 再使用 类似下面的deploy就行 mvn deploy:deploy-file -DgroupId=com.taobao.n ...
- Blackboard - 百度百科
http://wapbaike.baidu.com/view/1969844.htm?ssid=0&from=844b&uid=0&pu=sz%401320_1001%2Cta ...
- 用C++设计一个不能被继承的类(用私有构造函数+友元函数)
题目:用C++设计一个不能被继承的类. 分析:这是Adobe公司2007年校园招聘的最新笔试题.这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目. 在Java中定义了关键字f ...
- 使用svnkit 的相关实例及相关问题汇总
SVNKIT操作SVN版本库的完整例子 http://www.cnblogs.com/wangjiyuan/p/svnkitwanchenglizi.html#!comments 2.SVNClien ...
- cocos2d-x中使用JNI的调用JAVA方法
用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...
- NET单元测试的艺术
NET单元测试的艺术 开篇:上一篇我们学习基本的单元测试基础知识和入门实例.但是,如果我们要测试的方法依赖于一个外部资源,如文件系统.数据库.Web服务或者其他难以控制的东西,那又该如何编写测试呢?为 ...
- 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)
依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...
- A Game of Thrones(19) - Jon
The courtyard rang to the song of swords. Under black wool, boiled leather, and mail, sweat trickled ...
- JavaFX2: 鼠标拖动选择和Ctrl+Shift连续区间选择的ListView
JavaFX2的ListView中的多选没有提供鼠标拖动选择的功能,同时按下Ctrl和Shift后连续的区间选中也不支持,以下代码用于处理这两个问题,细节见代码注释: import com.sun.j ...
- iOS8开发~Swift(一)入门
一.概论及Swift介绍 iOS7刚公布多时候,苹果引入了JavaScriptCore.framework用来处理JavaScript,看到了能够接触其它编程语言的契机,使iOS程序猿不用吊死在OC这 ...