uva 交叉染色法10004
2014-07-19 16:55
211 查看
鉴于网上讲交叉染色的资料比较少,于是我把我自己的心得与方法贴出来,方便与大家共同进步。 二分图: 百度百科传送门 wiki百科传送门 判断一个图是否为二分图可以用交叉染色的方法来判断,可以用BFS,也可以用DFS,这里我用使用DFS来实现。 思路: 任意取一个点进行染色,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE的。 (1)如果没有染色,将它染色,并将它周围的点变成相反色。 (2)如果已经染色,判断是否与现在染色的点的颜色相同,相同,则退出,否则继续。 附上例题:UVA 10004 Bicoloring CODE #include<stdio.h> #include<string.h> #define N 300 int color ,vis ; struct node { int u,v,next; }bian[N*N*2]; int head ,yong; void addedge(int u,int v) { bian[yong].u=u; bian[yong].v=v; bian[yong].next=head[u]; head[u]=yong++; } int find(int u) { int i; for(i=head[u];i!=-1;i=bian[i].next) { int v=bian[i].v; if(!vis[v]) { vis[v]=1; color[v]=!color[u]; find(v); } else if(color[v]==color[u]) return 0; } return 1; } int main() { int n,m,a,b; while(scanf("%d",&n),n) { scanf("%d",&m); memset(head,-1,sizeof(head)); yong=0; memset(color,0,sizeof(color)); memset(vis,0,sizeof(vis)); while(m--) { scanf("%d%d",&a,&b); addedge(a,b); addedge(b,a); } color[0]=1; vis[0]=1; if(find(0)) printf("BICOLORABLE.\n"); else printf("NOT BICOLORABLE.\n"); } return 0; }
相关文章推荐
- uva 交叉染色法10004
- UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)
- uva10004 Bicoloring(交叉染色法)
- UVA - 10004 Bicoloring
- UVA 10004 Bicoloring
- UVA 10004 - Bicoloring
- uva10004 Bicoloring 二分图染色
- UVa10004 Bicoloring (dfs水题)
- CSU-ACM2017暑假集训比赛7 - D - Bicoloring - UVA - 10004
- acm-UVA10004解题报告
- UVA 10004 Bicoloring
- uva 10004 Bicoloring
- UVA 10004
- UVA 10004判断一个图是否为二分图
- UVA 10004 Bicoloring【DFS简单二部图判定】
- UVa 10004 - Bicoloring
- uva 10004 - Bicoloring
- uva 10004 Bicoloring
- uva 10004 - Bicoloring
- UVa 10004:Bicoloring