• 图论——二分图1:二分图以及判定


    图,有有向图,无向图,稠密图,简单图······

    算法,有贪心法,二分法,模拟法,倍增法······

    那,二分图是啥?

    二分法+有向图?

    于是,我查了许多资料,才对它有一定了解。

    二分图:二分图,是图论中的一种特殊模型,设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且同一集合中不同的两点没有边相连。

    这就是二分图。

    举个栗子吧:

    这是不是二分图?

    反正我第一次看觉得不是

    其实,是的,他是二分图,尽管看上去是连着的。

    若我们将图中的一些边转一下,变成:

    这就是一个明显的二分图。

    集合A与B中的点互不相连。

    因此,在手动判定二分图时学会转边!

    辣魔,二分图要用计算机判定怎么实现?

    数竞大佬:简单!

    !!!染色大法!!!

    有没有熟悉的感觉

    0表示还未访问,1表示在集合A中,2表示在集合B中。

    col(color)储存颜色。

    初始化为0.

    上代码:

     其实是模板

    可以记忆。

     1 vector <int> v[N];
     2 void dfs(int x,int y){
     3   col[x]=y;            
     4   for (int i=0; i<v[x].size(); i++) {
     5      if (!col[v[x][i]]) dfs(v[x][i],3-y);
     6      if (col[v[x][i]]==col[x]) FLAG=true;      //产生了冲突
     7   }
     8 }
     9 for (i=1; i<=n; i++) col[i]=0;    //初始化
    10 for (i=1; i<=n; i++) if (!col[i]) dfs(i,1);    //dfs染色
    11 if (FLAG) cout<<"NO"; else cout<<"YES";

    下一章我们将讲到二分图的匹配,我们明天见。

  • 相关阅读:
    C# LINQ和Lambda表达式详解
    .NET面试题2021.7.13
    linux每日命令(11):cat命令
    linux每日命令(10):touch命令
    linux每日命令(9):cp命令
    linux每日命令(8):mv命令
    linux每日命令(7):rmdir命令
    linux每日命令(5):mkdir命令
    进程和线程的区别?什么时候用进程?什么时候用线程?
    八种方式实现跨域请求
  • 原文地址:https://www.cnblogs.com/sillyben/p/9905456.html
Copyright © 2020-2023  润新知