首页 > 其他 > 详细

UVa 10004 二染色

时间:2015-02-01 01:55:46      阅读:198      评论:0      收藏:0      [点我收藏+]

题意:给定一个无向图,是强连通的,而且无自回路。对顶点进行染色,相邻的顶点需要用不同的颜色,但总共只有两种颜色,是否可行。

思路:二部图的判定。其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行。而这正是二部图的充要条件:无向图的所有回路长度都为偶数。  但这里如何判断回路长度不好实现。  这里的思路是,对图进行遍历,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 二染色

原文:http://blog.csdn.net/buxizhizhou530/article/details/43359119

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!