二分图判定(UVA10004)(DFS或者BFS)

这个题目的意思就是用两个颜色给图中每个点涂色,使相邻的点颜色不同。如果能有一个这样的方案,那么就输出"BICOLORING." 否则输出"NOT BICOLORING."。

BFS:

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define lc (d<<1)
#define rc (d<<1|1)
#define P pair
#define pi acos(-1)
int n,m,a[208][208],b[208],s;
bool bfs(int x)
{
    queuep;
    p.push(x);
    if(!b[x])  b[x]=1;
    while(p.size())
    {
        int e=p.front(),q=b[e];
        p.pop();
        FOR(i,0,n-1)
        {
            if(a[e][i])
            {
                if(b[i]==q)  return false;
                if(!b[i])
                {
                    if(q==1)  b[i]=2;
                    else  b[i]=1;
                    p.push(i);
                }
            }
        }
    }
    return true;
}
int main()
{
    cin.tie(0);
    while(cin>>n&&n)
    {
        si(m);
        REW(a,0);
        REW(b,0);
        s=0;
        while(m--)
        {
            int x,y;
            si(x),si(y);
            a[x][y]=1;
            a[y][x]=1;
        }
        FOR(i,0,n-1)
        {
            if(!b[i]&&!bfs(i))
            {
                s++;
                break;
            }
        }
        if(s)  cout<<"NOT BICOLORABLE."<


DFS:

 

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define lc (d<<1)
#define rc (d<<1|1)
#define P pair
#define pi acos(-1)
int n,m,a[208][208],b[208],s;
bool dfs(int x)
{
    if(!b[x])  b[x]=1;
    int q=b[x];
    FOR(i,0,n-1)
    {
        if(a[x][i])
        {
            if(b[i]==q)  return false;
            if(!b[i])
            {
                if(q==1)  b[i]=2;
                else  b[i]=1;
                dfs(i);
            }
        }
    }
    return true;
}
int main()
{
    cin.tie(0);
    while(cin>>n&&n)
    {
        si(m);
        REW(a,0);
        REW(b,0);
        s=0;
        while(m--)
        {
            int x,y;
            si(x),si(y);
            a[x][y]=1;
            a[y][x]=1;
        }
        FOR(i,0,n-1)
        {
            if(!b[i]&&!dfs(i))
            {
                s++;
                break;
            }
		}
        if(s)  cout<<"NOT BICOLORABLE."<

 

 

 

 

 

你可能感兴趣的:(二分图判定(UVA10004)(DFS或者BFS))