UVa 10004 - Bicoloring

一个图的题,但也可以找规律来做。两种颜色图一个图,要求相邻两点颜色不能相同,显然,以三角形环为例往外推,只要是形成奇数多边形的环,就不可能实现相邻两点的颜色不同,因此只要以每个点为基准,找出所有形成的环,只要存在奇数环就说明不能被涂色,否则就可以~~~

代码如下:

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;

int main()
{
#ifdef test
    freopen("sample.txt","r",stdin);
#endif
    int x[200+2],y[200+2],n,l,num;
    while(scanf("%d",&n) && n)
    {
        int ff=0;
        scanf("%d",&l);
        for(int i=0; i<l; i++)
            scanf("%d%d",&x[i],&y[i]);
        for(int i=0; i<l; i++)
        {
            num=1;     // 对环进行记数
            int ii=i,cct=1;
            while(cct<n) //循环的次数最多不会超过点的个数
            {
                cct++;
                int flag=0;
                for(int j=0; j<l; j++)
                    if(ii!=j && y[ii]==x[j])
                    {
                        flag=1;
                        ii=j;
                        num++; //每多一个点就计数一次
                        break;
                    }
                if(flag==0)
                    break;
            }
            if(y[ii]==x[i]&&num%2==1&&num!=1)  // 若为环(不能是自环,即:num!=1)且为奇数多边形则不能完成涂色
            {
                ff=1;
                break;
            }
        }
        if(ff==1)
            printf("NOT BICOLORABLE.\n");
        else
            printf("BICOLORABLE.\n");
    }
    return 0;
}


你可能感兴趣的:(UVa 10004 - Bicoloring)