二分图

如果两个结点由于某些性质不能归属到一个集合,那么在这两个点之间连一条边。在遍历所有点对,建图之后。如果通过染色法成功对图进行染色,那么这个图就是一个二分图,否则这个图不是二分图。下面是染色法判断二分图的模板。

  1. const int N = 1010, M = N * N;
  2. int color[N];
  3. int h[N], e[M], ne[M], idx;
  4. bool dfs(int u, int c) {
  5. color[u] = c;
  6. for(int i = h[u]; ~i; i = ne[i]) {
  7. int j = e[i];
  8. if(color[j] == c) {
  9. return false;
  10. }
  11. if(color[j] == -1 && !dfs(j, 1 - c)) {
  12. return false;
  13. }
  14. }
  15. return true;
  16. }
  17. bool ok = true;
  18. memset(color, -1, sizeof color);
  19. for(int i = 0; i < n; i++) {
  20. if(color[i] == -1 && !dfs(i, 0)) {
  21. ok = false;
  22. break;
  23. }
  24. }