Checking whether a Graph is Bipartite

二分图判定

May 17, 2017

题目链接:pdf

题目给一个无向图,判定这个图是否是二分图。

所谓二分图就是,用可以两种颜色给这个图的所有节点染色,并且满足相邻两个点颜色不同。

思路:

模拟染色过程,遍历所有点,如果这个点没有被染色,那么用BFS从这个点开始染色,当出现两个点颜色相同,说明这个图不是二分图。如果这个点已经被染色过,那么判断一下和这个点直接相连的点和它的颜色是否相同。

// Sun May 14 21:24:26 CST 2017
// Sun May 14 21:43:44 CST 2017


/*
  二分图判定
*/

#include <iostream>
#include <vector>
#include <queue>

using std::vector;
using std::queue;

int bipartite(vector<vector<int> > &adj) {
  int result = 1;
  vector<int> color(adj.size(), -1);
  queue<int> que;

  for (size_t i = 0; i < adj.size(); ++i) {
    if (-1 == color[i]) {
      color[i] =1;
      que.push(i);

      while (!que.empty()) {
	int cur = que.front();
	que.pop();

	for (auto v : adj[cur]) {
	  if (-1 == color[v]) {
	    color[v] = 1 - color[cur];
	  }
	  else if (color[v] == color[cur]) {
	    return 0;
	  }
	}
      }
    }
    else {
      for (auto v : adj[i]) {
	if (color[v] == color[i]) {
	  return 0;
	}
      }
    }
  }
  
  return result;
}

int main() {
  int n, m;
  while (std::cin >> n >> m) {
    vector<vector<int> > adj(n, vector<int>());
    for (int i = 0; i < m; i++) {
      int x, y;
      std::cin >> x >> y;
      adj[x - 1].push_back(y - 1);
      adj[y - 1].push_back(x - 1);
    }
    std::cout << bipartite(adj) << "\n";
  }
}

comments powered by Disqus