Problem:In 1976 the ``Four Color Map Theorem" was proven with the assistance of a computer. This theorem states that every map can be colored using only four colors, in such a way that no region is colored using the same color as a neighbor region.
Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:
- no node will have an edge to itself.
- the graph is nondirected. That is, if a node a is said to be connected to a node b, then you must assume that b is connected to a.
- the graph will be strongly connected. That is, there will be at least one path from any node to any other node.
Input:The input consists of several test cases. Each test case starts with a line containing the number n ( 1 < n< 200) of different nodes. The second line contains the number of edges l. After this, l lines will follow, each containing two numbers that specify an edge between the two nodes that they represent. A node in the graph will be labeled using a number a ( ).
An input with n = 0 will mark the end of the input and is not to be processed.
Output:You have to decide whether the input graph can be bicolored or not, and print it as shown below.
解法:判断是否可以二分染色。直接dfs即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#define inf 0x7fffffff
#define exp 1e-10
#define PI 3.141592654
using namespace std;
const int maxn=;
int color[maxn];
vector<int> G[maxn];
int bi(int u)
{
int k=G[u].size();
for (int i= ;i<k ;i++)
{
int v=G[u][i];
if (!color[v])
{
color[v]=-color[u];
if (!bi(v)) return false;
}
if (color[v]==color[u]) return false;
}
return true;
}
int main()
{
int n,l;
while (scanf("%d",&n)!=EOF)
{
if (!n) break;
scanf("%d",&l);
for (int i= ;i<=n ;i++) G[i].clear();
memset(color,,sizeof(color));
int a,b;
for (int i= ;i<l ;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
color[]=;
int flag=bi();
if (flag) cout<<"BICOLORABLE."<<endl;
else cout<<"NOT BICOLORABLE."<<endl;
}
return ;
}