首页 > 学院 > 开发设计 > 正文

UVA 10004 Bicoloring(二分图 交叉染色)

2019-11-06 09:02:52
字体:
来源:转载
供稿:网友

UVA 10004 Bicoloring

题目大意

判断一个无向图是否是二分图

分析

在交叉染色的过程中判断一个图是否是二分图。

如果一个图是二分图,那么一定存在一个染色方案将所有点染成两种染色之一,满足任何边的两端都不同色

可以通过深搜来求解。初始时所有点都未染色,先给定一个点某一种颜色,然后从这个点出发进行深搜。比如从u出发开始深搜的过程中,搜到了v,有三种情况:

v未染色:将v染成和u不同颜色 v已经染色且和u不同色:跳过v继续搜 v已经染色且和同色:说明出现了矛盾,该图不是二分图

代码

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>#include<stack>using namespace std;const int MAXN=100005;int n,m;int color[MAXN];//未被染色时是-1int flag;//flag为1表示是二分图struct Edge{ int to; int next;}edge[MAXN*5];int edgecount;int head[MAXN];void Init(){ memset(color,-1,sizeof(color)); memset(head,-1,sizeof(head)); edgecount=0; flag=1;//flag为1表示是二分图}void Add_edge(int u,int v){ edge[++edgecount].to=v; edge[edgecount].next=head[u]; head[u]=edgecount;}void Dfs(int u)//x表示将要进行深搜的点,c表示给x染上的颜色,是二分图返回1{ for(int k=head[u];k!=-1;k=edge[k].next) { int v=edge[k].to; if(color[v]==-1) { color[v]=!color[u]; Dfs(v); } else if(color[v]==color[u]){flag=0;return ;}//v已经染色且和同色:说明出现了矛盾,该图不是二分图 else continue;//v已经染色且和u不同色:跳过v继续搜 }}int main(){ int a,b; while(scanf("%d",&n)!=EOF) { if(n==0)break; scanf("%d",&m); Init(); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); a++;b++;//输入时有编号为0的点 Add_edge(a,b); Add_edge(b,a); } color[1]=0; Dfs(1); if(flag==1)cout<<"BICOLORABLE."<<endl; else cout<<"NOT BICOLORABLE."<<endl; } return 0;}
上一篇:unity5.X AssetBundle

下一篇:IDA远程调试linux

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表