UVa 10004 二染色
2015-02-01 01:14
288 查看
题意:给定一个无向图,是强连通的,而且无自回路。对顶点进行染色,相邻的顶点需要用不同的颜色,但总共只有两种颜色,是否可行。
思路:二部图的判定。其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行。而这正是二部图的充要条件:无向图的所有回路长度都为偶数。 但这里如何判断回路长度不好实现。 这里的思路是,对图进行遍历,dfs或bfs都可以,在遍历的过程中进行染色,当发现冲突时即不可行。
Code:
思路:二部图的判定。其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行。而这正是二部图的充要条件:无向图的所有回路长度都为偶数。 但这里如何判断回路长度不好实现。 这里的思路是,对图进行遍历,dfs或bfs都可以,在遍历的过程中进行染色,当发现冲突时即不可行。
Code:
#include<stdio.h> #include<string.h> bool dfs(int k,int n); int graph[210][210]; int vis[210]; int color[210]; int main() { //freopen("10004.in","r",stdin); //freopen("10004.out","w",stdout); int n,nl; while(scanf("%d%d",&n,&nl)==2 && n) { memset(graph,0,sizeof(graph)); memset(vis,0,sizeof(vis)); int i,j; for(int k=0;k<nl;++k) { scanf("%d%d",&i,&j); graph[i][j]=graph[j][i]=1; } vis[0]=1; color[0]=1; if(dfs(0,n)) printf("BICOLORABLE.\n"); else printf("NOT BICOLORABLE.\n"); } return 0; } bool dfs(int k,int n) { for(int i=0;i<n;++i) { if(graph[k][i]) { if(!vis[i])//结点k和结点i有条边,且结点i未被访问 { vis[i]=1; color[i]=!color[k];//取相反颜色 if(dfs(i,n)==0) return false; } else if(color[i]==color[k])//注意这个判断也应该是在 判断是否邻接的if语句里 { return false; } } } return true; }
相关文章推荐
- uva 10004 Bicoloring 二染色
- UVA 10004 Bicoloring(DFS染色)
- UVA10004- Bicoloring(二染色)
- uva 10004 Bicoloring(二染色)
- uva10004 Bicoloring 二分图染色
- uva 10004 Bicoloring (二分图染色/求一个二分图)
- UVA 10004 二染色
- uva10004 Bicoloring 黑白染色问题,DFS
- uva10004 Bicoloring 黑白染色问题,DFS
- UVA - 10004 - Bicoloring(染色问题)
- uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
- UVA 10004判断一个图是否为二分图
- uva 交叉染色法10004
- UVA-11080-Place the Guards (二分图染色)
- UVA - 11396 Claw Decomposition(二分图染色)
- UVa 10004 - Bicoloring
- uva 193 Graph Coloring(图染色 dfs回溯)
- UVa 10004 - Bicoloring
- UVA OJ Bicoloring 10004
- UVA 1364 - Knights of the Round Table (获得双连接组件 + 二部图推理染色)