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