我是靠谱客的博主 健壮铅笔,这篇文章主要介绍UVa:10004 Bicoloring,现在分享给大家,希望可以做个参考。

问能否用两种颜色进行染色使得相邻的点不同色。

 

以前做的时候不知道,其实这个题很有来头。

 

把相邻顶点染成不同颜色的问题叫做图着色问题。对图进行染色所需要的最小颜色数称为最小着色数。最小着色数是2的图称作二分图。

 

这个题居然就是二分图的判定。

 

二分图的定义:

设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

 

当然这个题不需要知道这么多。按照题意来染色就行了。

可以用BFS也可以用DFS,我用了BFS。

如果某点未染色就染上跟临近点不同的颜色,如果已经染色就判断,如果跟临近点同色说明不是二分图,如果不同色就继续染色,直到全部上色则说明是二分图。

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <queue> using namespace std; int a[205][205], vis[205]; int n,m; bool bfs() { memset(vis,0,sizeof(vis)); queue<int> q; q.push(0); vis[0]=1; while(!q.empty()) { int t=q.front(); q.pop(); for(int i=0;i<n;++i) { if(a[t][i]==1) { if(vis[i]==0) { if(vis[t]==1) vis[i]=-1; else if(vis[t]==-1) vis[i]=1; q.push(i); } else { if(vis[i]==vis[t]) return false; } } } } return true; } int main() { while(scanf("%d",&n)&&n) { scanf("%d",&m); int u,v; memset(a,0,sizeof(a)); for(int i=0;i<m;++i) { scanf("%d%d",&u,&v); a[u][v]=a[v][u]=1; } if(bfs()) puts("BICOLORABLE."); else puts("NOT BICOLORABLE."); } return 0; }

最后

以上就是健壮铅笔最近收集整理的关于UVa:10004 Bicoloring的全部内容,更多相关UVa:10004内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部