zoukankan      html  css  js  c++  java
  • 图论·二分图

    二分图判定

    对于无向图$G=(V,E)$,如果可以把节点集分成不相交的两部分,即$X$和$Y=V - X$,使得每条边边的其中一个端点在$X$中,另一个端点在$Y$中,则称图$G$是二分图(bipartite graph)。二分图的另一个等价说法是,可以把每个结点着以黑色和白色之一,使得每条边的两个端点颜色不同。不难发现,非连通的图是二分图当且仅当每个连通分量是二分图,因此我们只考虑无向连通图。容易看出,无环连通图一定是二分图。下面给出判断结点$u$所在的连通分量是否是二分图的代码:

     1 int color[maxn];
     2 bool dfs(int u){
     3     FOR(i, 0, G[u].size() - 1){
     4         int v = G[u][i];
     5         if(color[v] == color[u]) return 0;
     6         if(!color[v]){
     7             color[v] = 3 - color[u];
     8             if(!dfs(v)) return 0;
     9         }
    10     }
    11     return 1;
    12 }
    13 bool bipartite(int u){
    14     clr(color, 0);
    15     color[u] = 1;
    16     return dfs(u);
    17 }

    原理很简单,就是把$u$结点的颜色置为$1$,以其为跟扩展出一棵dfs树,当且仅当所有结点对颜色不冲突时无向图为二分图。

  • 相关阅读:
    输入流输出流打印到文件
    前缀和
    树形dp
    快速幂 ,快速幂优化,矩形快速幂(java)
    尾递归
    java中bigInteger的应用
    求树的最大直径
    买不到的数目
    ccpc 长春站 G
    大学ACM第二周心得
  • 原文地址:https://www.cnblogs.com/astoninfer/p/5758084.html
Copyright © 2011-2022 走看看