题目大意:二染色。

条件:

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;
}


 

 

posted on 2012-10-09 17:52  有间博客  阅读(652)  评论(0编辑  收藏  举报