UVA 10004 Bicoloring

 

 

题目大意:二染色。

条件:

1、不存在环

2、图是连通图

3、双向图

 

思路:

任意取一个点进行染色,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE的。
(1)如果没有染色,将它染色,并将它周围的点变成相反色。

(2)如果已经染色,判断是否与现在染色的点的颜色相同,相同,则退出,否则继续。

 

CODE:

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 102
using  namespace std;

const  int M =  1001;
int G[M][M];
int vis[M];
bool color[M];
int n, m, flag;

int dfs( int u)
{
     for( int i =  0; i < n; i++)  if(G[u][i])
    {
         if(!vis[i])
        {
            vis[i] =  1;
            color[i] = !color[u];
            dfs(i);
        }
         else  if(color[u] == color[i])
             return  0;
    }
     return  1;
}


void init()
{
    memset(G,  0sizeof(G));
    memset(vis,  0sizeof(vis));
}


int main()
{
     while(~scanf( " %d ", &n) && n)
    {
        init();
        scanf( " %d ", &m);
         while(m--)
        {
             int u, v;
            scanf( " %d%d ", &u, &v);
            G[u][v] = G[v][u] =  1;
        }
        color[ 0] =  1;
        vis[ 0] =  1;
         if(dfs( 0)) printf( " BICOLORABLE.\n ");
         else printf( " NOT BICOLORABLE.\n ");
    }
     return  0;
}


 

 

你可能感兴趣的:(color)