[图的搜索]二分图判定
来源:互联网 发布:c语言选择语句 编辑:程序博客网 时间:2024/05/01 09:48
二分图判定:
给定一个具有n个顶点,v条边的图。要给图上每个顶点染色,并且要使相邻的顶点颜色不同。问是否能最多用2种颜色进行染色?题目保证没有重边和自环。
限制条件:
1≤n≤1000
1≤v≤100000
样例输入:
4 4
0 1
0 3
2 1
2 3
3 3
0 1
0 2
1 2
样例输出:
Yes
No
把相邻顶点染成不同颜色的问题叫做图着色问题。对图进行染色所需要的最小颜色数称为最小着色数。最小着色数是2的图称作二分图。
如果只用2种颜色,那么确定一个顶点的颜色之后,和他相邻的顶点颜色也就确定了。因此,选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是否可以被两种颜色染色了。这个问题可以用dfs来简单地实现。
#include <iostream>#include <vector>#include <cstdio>#include <cstring>const int MAXN =1005;using namespace std;vector<int> G[MAXN];int color[MAXN];int V,E; //顶点,边bool dfs(int v,int c){ //printf(" %d %d\n",v,c); color[v] = c; for(int i = 0;i < G[v].size();i++) { if (color[G[v][i]] == c) return false; if (color[G[v][i]] == 0 && !dfs(G[v][i],-c)) return false; } return true;}int main(){ scanf("%d%d",&V,&E); //输入 for(int i = 0; i < E;i++) { int s,t; scanf("%d%d",&s,&t); G[s].push_back(t); G[t].push_back(s); } int flag = 1; for(int i = 0;i<V;i++) { if(color[i] == 0) { if (!dfs(i,1)) { flag = 0; break; } } } if (flag) printf("Yes\n"); else printf("No\n"); return 0;}
0 0
- [图的搜索]二分图判定
- 二分图的判定
- 二分图的判定
- 二分图的判定
- 二分图的判定
- 二分图的判定
- 二分图判定的两种搜索实现
- 二分图的判定 -- 着色
- hdu5285 二分图的判定
- 【算法】二分图的判定
- 二分图之二分图的判定
- hihocoder 二分图判定 简单搜索和超快板子
- Catch----二分图的判定与奇环的判定
- p1403 二分+二分图判定
- 二分图判定
- 二分图判定
- 二分图判定
- 二分图判定
- 大数据学习之BigData常用算法和数据结构
- C++常见面试题
- 【OSS】Bucket读写权限
- cmd安装weblogic12c的时候总是说jre不是有效的JDK
- I am a student 单词逆序输出
- [图的搜索]二分图判定
- 6种简历错误,你中枪了没?
- NoSQL的三大基石(CAP、BASE和最终一致性)
- dojo.byId与registry.byId、dijit.byId
- 值调用(call by value)和引用调用(call by reference)
- Linux内核SMP负载均衡浅析
- Java NIO系列教程(一) Java NIO 概述 Channel
- HDOJ 2561 第二小整数
- Ubuntu下添加开机启动项的2种方法