Friday, November 2, 2012

Bipartite Graph Check

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
using namespace std;
#define siz 205
vector <int> vec[siz];
int color[siz];

void bfs(int source, int destination){
    int u,v;
    for(int i=0;i<=destination;i++) color[i]=-1;
    queue <int> q;
    q.push(source);
    color[source]=0;
    int flag=0;
    while(!q.empty()){
        u = q.front();
        q.pop();
        for(int i=0;i<vec[u].size();i++){
            v=vec[u][i];
            if(color[v]!=color[u]){
                if(color[v]==-1){
                    if(color[u]==0) color[v]=1;
                    else color[v]=0;
                    q.push(v);
                }
            }
            else{
                flag=1;
                break;
            }
        }
        if(flag==1) break;
    }
    if(flag==0) printf("BICOLORABLE.\n");
    else printf("NOT BICOLORABLE.\n");

}

int main()
{
    int n,e,x,y;
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n)==1){
        if(n==0) break;
        scanf("%d",&e);
        for(int i=0;i<=n;i++)
            vec[i].clear();
        for(int i=0;i<e;i++){
            scanf("%d%d",&x,&y);
            vec[x].push_back(y);
            vec[y].push_back(x);
        }
        bfs(0,n);
    }
    return 0;
}



No comments:

Post a Comment