午夜稻草人

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

怎样判断一个图是否为二分图?

无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。

如果需要分出哪些顶点是一组,很简单,用染色法,即从其中一个顶点开始,将跟它邻接的点染成与其不同的颜色,如果邻接的点有相同颜色的,则说明不是二分图,用 bfs 或 dfs 遍历即可。

 

#include <queue>
#include <cstring>
#include <iostream>
using namespace std;

const int N = 510;
int col[N], g[N][N];

//0为白色,1为黑色 
bool bfs(int s, int n) {
    queue<int> p;
    p.push(s);
    col[s] = 1;
    while(!p.empty()) {
        int from = p.front();
        p.pop();
        for(int i = 1; i <= n; i++) {
            if(g[from][i] && col[i] == -1) {
                p.push(i);
                col[i] = !col[from];//染成不同的颜色 
            }
            if(g[from][i] && col[from] == col[i])//颜色有相同,则不是二分图 
                return false;
        }
    }
    return true;     
}

int main() {
    int n, m, a, b, i;
    memset(col, -1, sizeof(col));
    cin >> n >> m;
    for(i = 0; i < m; i++) {
        cin >> a >> b;
        g[a][b] = g[b][a] = 1; 
    }
    bool flag = false;
    for(i = 1; i <= n; i++)
        if(col[i] == -1 && !bfs(i, n)) {//遍历各个连通分支 
            flag = true;
            break;  
        }
    if(flag)
        cout << "NO" <<endl;    
    else
        cout << "YES" <<endl;
    return 0;
}

 

 

 

posted on 2014-05-06 13:37  午夜稻草人  阅读(1517)  评论(0编辑  收藏  举报