精华内容
下载资源
问答
  • 二部图判定算法之染色法

    千次阅读 2018-12-24 17:16:33
    二部图判定算法——染色法染色法初始化条件步骤复杂度 染色法 对任意图G,利用红、蓝两种颜色(或其它任意两种不同颜色)对其顶点进行染色来判断图G是否为二部图。 初始化条件 顶点集合V = V(G),已染色顶点集合...


    什么是二部图?

    二部图又称作二分图偶图,是图论中的一种特殊模型。设 G=(V , E) 是一个无向图,若顶点集 V 可以分割成两个互不相交的子集 U 和 V,并且图 G 中的任意一条边 (i , j) 所关联的两个顶点 i 和 j 分别属于这两个不同的顶点集,即 (i in U , j in V),则称图 G 为一个二部图。
    二部图示例

    什么是染色法?

    染色法所做的工作是:对于任意图 G,利用红、蓝两种颜色(或其它任意两种不同颜色)对其顶点进行染色,依据染色的结果来判断图 G 是否为二部图。

    算法初始化条件

    对于待判断的图 G,设顶点集合 V=V(G),已染色顶点集合 C=空集,已扫描顶点集合 S=空集。

    算法步骤及流程

    1. 从 V\C(未染色顶点集合)中任取一个未染色的顶点,染成红色,并入已染色顶点集合 C 中;
    2. 判断:已扫描顶点集合 S==顶点集合V ? 是,则算法结束,图 G 是二部图 : 不是(S<V),则转向 3.;
    3. 判断:已扫描顶点集合 S==已染色顶点集合C ? 是(S=C<V),则转向 1. : 不是(S<C<V),则转向 4.;
    4. 从 C\S(已染色但未扫描顶点集合)中任取一个顶点 w,扫描图 G 中与 w 相临的所有顶点:
      1. 如果顶点未染色,则染上与 w 相异的颜色,并入已染色顶点集合 C 中;
      2. 如果顶点染有与 w 相异的颜色,则不做改变继续扫描其它顶点;
      3. 如果顶点染有与 w 相同的颜色,则算法结束,图 G 不是二部图。
        (每个顶点扫描完成后都并入已扫描顶点集合 S 中,最后全部扫描完成后转向 2.)
        染色法算法流程图

    算法复杂度

    染色法判断二部图的算法时间复杂度为 O(n^2)

    展开全文
  • 应用遗传算法来判定二部图的具体过程是首先将无向图G的节点随机分配到两个不同社区中,然后用遗传算法进行进化操作,优化无向图G的模块化函数Q,当Q取最小值且无向图G的边只存在于两个社区之间,则无向图G为二部图。...
  • 二部图定义的基础上,给出一种基于邻接矩阵的新判定算法,通过在每对结点间逐步插入中间结点进行路径长度检测,并进行了实验测试。结果表明,新算法能较好解决二部图判定问题。
  • 题目大意:给出无向图的若干条边,要求对每条边的两...解题策略:实质就是判断是否给出的无向图是不是一个二部图,  刚开始想到一个算法:从起点开始BFS,生成一个广度优先生成树,判断每一层任意两个结点是否邻接,

    题目大意:给出无向图的若干条边,要求对每条边的两个点染色,若任意两个邻接点颜色不同,输出"BICOLORABLE", 否则输出"NOT BICOLORABLE"。

    解题策略:实质就是判断是否给出的无向图是不是一个二部图,

                        刚开始想到一个算法:从起点开始BFS,生成一个广度优先生成树,判断每一层任意两个结点是否邻接,

                                                                若存在邻接情况,即判断不是二部图,输出答案

                        后来看了网上的解题策略,发现DFS可以很简单易懂的解决本题。

                        思路详见注释。

                     

    /*
       UVA 10004 Bicoloring
       AC by J_Dark
       ON 2013/4/20
       Time 0.008s
    */
    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 205;
    int nodeNum, pathNum, ff, node[maxn][maxn], color[maxn];
    bool visited[maxn];
    //
    void initial(){
    	memset(node, 0, sizeof(node));
    	memset(visited, false, sizeof(visited));
    }
    
    void Input(){
    	 int u, v;
         for(int i=0; i<pathNum; i++){
    		cin >> u >> v;
    		node[u][v] = node[v][u] = 1;
    	 }
    }
    
    void DFS(int u){
    	for(int v=0; v<nodeNum; v++){
    		if(node[u][v]){ //若邻接
    			if(!visited[v]){ //且邻接点未染色
    				visited[v] = true; //标记已染色
    				color[v] = !color[u]; //染相反色
    				DFS(v); //从邻接点深搜
    			}
    			//若邻接点已染色且与深搜点颜色相同, 判定不是二部图,停止搜索
    			else if(color[u] == color[v]){
    				ff = 0;
    				return;
    			}
    		}
    	}
    }
    
    void Solve(){
    	ff = 1;
    	visited[0] = true; //标记已搜
    	color[0] = 1; //标记已染色
    	DFS(0); 	//从第一个点开始深搜
    	if(ff)   cout << "BICOLORABLE." << endl;
    	else   cout << "NOT BICOLORABLE." << endl;
    }
    //
    int main(){
        while(cin >> nodeNum >> pathNum && nodeNum)
        {
    		  initial();
              Input();
              Solve();
        }
        //system("pause");
        return 0;
    }


    展开全文
  • 二部图问题(染色法): 分为三种颜色状态,用(-1,0,1)代表,0为没染色。一开始先设成全都是没染色状态。 然后DFS遍历每个点进行染色,若遍历到没有染色的点,则把他染为1色,把他邻接的点染为-1,如果遇到邻接...

    解治法:

    二部图问题(染色法):

    分为三种颜色状态,用(-1,0,1)代表,0为没染色。一开始先设成全都是没染色状态。

    然后DFS遍历每个点进行染色,若遍历到没有染色的点,则把他染为1色,把他邻接的点染为-1,如果遇到邻接点颜色相同,则退出,判断为非二部图。

    #include<iostream>
    #include <vector>
    #include <math.h>
    using namespace std;
    
    const int number = 8;
    bool ifbipatrion = true;
    vector<int> Nodes[number];//存点数据
    int Nodescolor[number];//用于给点染色,0为没染色,1和-1为两种颜色
    
    void dfs(int node){
        if(ifbipatrion == false)
            return;
        for(int i=0;i<Nodes[node].size();i++){
            
            int pos = Nodes[node].at(i);
            int color = Nodescolor[pos];
            if(color == 0)
            {
                if(Nodescolor[node]>0){
                    Nodescolor[pos] =-1;
                    dfs(pos);
                }
                else if(Nodescolor[node]<0){
                    Nodescolor[pos] =1;
                    dfs(pos);
                }
            }
            else if(color == Nodescolor[node])
            {
                ifbipatrion = false;
    return;
            }
            
            
        }
    }
    
    bool ifBi(){
         for(int i = 0;i<number;i++){
             if(!Nodescolor[i] && ifbipatrion)
             {
                 Nodescolor[i] = 1;
                 dfs(i);
             }
         }
        
        return ifbipatrion;
        
    }


    关节点问题:


    对图生成DFS搜索树,我们可以发现有两类节点可以成为割点:

    1:对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;

    2:对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。

    对于根结点,显然很好处理;但是对于非叶子节点,怎么去判断有没有回边是一个值得深思的问题。

    我们用dfn[u]记录节点u在DFS过程中被遍历到的次序号,low[u]记录节点u或u的子树通过非父子边追溯到最早的祖先节点(即DFS次序号最小),那么low[u]的计算过程如下:


    情况1:low[u]={min{low[u], low[v]}【(u,v) 为树边 且v不为u的父亲节点】

    情况2:low[u]=min{low[u], dfn[v]} 【(u,v)为回边且v不为u的父亲节点】

    对于情况2,当(u,v)为树边且low[v] >= dfn[u]时,节点u才为割点。该式子的含义:以节点v为根的子树所能追溯到最早的祖先节点要么为v要么为u。



    void dfs(int u){
        
        visited[u] = true;
        int childrennumber = 0 ;
        dfn[u] = low[u] = dfnumber;
        dfnumber++;
        for(int i=0;i<Nodes[u].size();i++){
            int pos = Nodes[u].at(i);
            if(!visited[pos]){
                childrennumber++;
                parent[pos]=u;
                dfs(pos);
                low[u] = low[u]<low[pos]?low[u]:low[pos];
                
                if(parent[u]==-1&&childrennumber>1){
                    resultpoints.push_back(u);
                }
                if(parent[u]!=-1&&low[pos]>=dfn[u]){
                     resultpoints.push_back(u);
                }
            }
            else if(pos!= parent[u]){
                low[u] = low[u]<dfn[pos]?low[u]:dfn[pos];
            }
            
            
        }
        
    }
    



    展开全文
  • 目录石墨笔记 PPT版1 二部图 偶图 双图 二分图 Ks,t G(V1,V2,E)2 欧拉图3 哈密顿图4 平面图欧拉公式推论: n-m+r = k+1m <=3n-6是平面图的必要条件m <= ((k-2)/k )*(n-2)是平面图的必要条件库拉图斯基定理: ...

    石墨笔记 PPT版

    https://shimo.im/docs/TPjwqXqPr8PCRWdD

    1 二部图 偶图 双图 二分图 Ks,t G(V1,V2,E)

    使用场景 选取部门分管人员,
    完全二部图:V1与V2中任一顶点有且仅有一条关联
    完全 二部图Kst:定点数n=s+t,边数m=k*s
    充分必要条件:当且仅当G中无奇数长度的回路
    匹配:二部图中的边互不相邻
    极大匹配: E1∈E,E1中再加一条边就不匹配了,E1是极大匹配
    最大匹配:二部图G中边数最多的匹配称为G的最大匹配
    完备匹配: V1<=V2,E1=V1,E1是V1到V2的完备匹配
    完美匹配:完备匹配条件为V1=V2时,双射关系
    霍尔(Hall)定理:V1中任意的k个结点至少与V2中的k个结点相邻 ,相异性条件,算法复杂度为2的n次幂,也是判定二分图的充分必要条件
    t条件(充分条件):
    ①V1中每个顶点至少关联t条边
    ②V2中每个顶点至多关联t条边
    ③则说明G中存在V1到V2的完备匹配

    如何判断二部图:
    1 先用充分条件t条件判断,若满足则为二部图
    2 利用二部图 无奇数长度回路的特性判断,若有则不是
    3 1不能判断出来再用相异性条件

    2 欧拉图

    哥尼斯堡问题,一笔画完问题

    平凡图是欧拉图,平凡图是只有一个顶点的图
    欧拉通路是简单通路(简单图不含平行边也不含环的图,所有边不同的通路是简单通路)
    欧拉通路:G中经过每条边一次并且仅有一次的通路
    欧拉回路:G中每条边只经过一次的回路称做欧拉回路
    有欧拉通路,没有欧拉回路的图不是欧拉图

    无向欧拉回路,连通图且无奇度顶点
    无向欧拉通路,连通图恰有两个奇度顶点,在有两个奇度顶点的连通图中,每条欧拉通路都以这两个奇度顶点为端点. 例子:矩形加一条对角线
    有向欧拉回路:连通且所以顶点入度=出度
    有向欧拉通路:连通且两个奇度顶点,一个入度+1=出度,另一个出度+1=入度
    若存在入度比出度大2,或出度比入度大2的顶点,肯定没有欧拉通路,更不是欧拉图

    3 哈密顿图

    环游世界问题,
    哈密顿通路:G经过图中每个顶点一次且仅一次的通路
    哈密顿回路:G经过图中每个顶点一次且仅一次的回路
    哈密顿图:存在哈密顿图

    哈密顿图的特性:
    1 一定是连通图
    2 是初级通路,初级回路 (通路(回路)中所有结点不同,边也不同)
    3 存在哈密顿回路一定有哈密顿通路,反之不一定

    哈密顿图的必要条件:
    P(G-V1) <= |V1| 减去V1个顶点的连通分支小于等于V1顶点的个数
    推论:有割点的图一定不是哈密顿图

    无向图哈密顿涂的充分条件:
    设G是n(n>=3)的无向简单图,对于G中一对不相邻的顶点u,v均有
    d(u)+d(v) >= n-1 则G中存在哈密顿通路, 又若
    d(u)+d(v) >= n , 则G中存在哈密顿回路
    推论: G是n(n>=3)阶无向简单图,如果任一顶点V>=n/2,则G是哈密顿图
    注意这是充分条件,不满足充分条件任然可以是哈密顿图,如 正六边形

    其他判定方法:
    方法一 删除高度数点,必要条件判定
    方法二 反证法
    方法3 AB标记法
    有向图中哈密顿通路怕你当:
    n>=2阶的有向图中,如果略去所有方向,所得无向图中含生成子图Kn,则D中存在哈密顿图

    4 平面图

    平面图:除顶点外没有边交叉的图
    包含面的回路称为面的边界
    面r的边界长度称为该面的次数:
    平面图所有面的次数之和等于其边数的二倍
    极大平面图:任意不相邻顶点加一条,所得图为非平面图
    极大平面图的性质:
    1 极大平面图是连通的
    2 n(n>=3)阶平面图是极大平面图的充分必要条件是他的每个面的次数都为3

    欧拉公式

    n-m+r = 2
    n:节点数
    m:面的次数,围成面的边数
    r:面的个数

    推论: n-m+r = k+1

    G是具有k(k>=2)个连通分支的平面图

    m <=3n-6是平面图的必要条件

    不满足m <=3n-6是非平面图

    m <= ((k-2)/k )*(n-2)是平面图的必要条件

    G是连通的平面图,且每个面的次数至少为K ,n是顶点数 ,m是边数
    注意:K不是度数,是面的次数

    证明K5和K3,3都不是平面图 (K5是五个顶点的完全图)
    K5 中 n=5,边数 m=10,若K5是平面图则每个面的次数至少大于等于3
    10 <= 3/3-2 *(5-2)=9
    这是个矛盾,因而K5不是平面图

    K3,3作为偶图,回路的长度为偶数,且长度>3,所以回路长度至少为4,m>=4
    ,n=6,m是边数等于9
    9 <= 4/4-2 *(6-2) = 8
    矛盾,所有K3,3不是平面图

    库拉图斯基定理:

    1 一个图是平面图当且仅当它不含与k5同胚的子图,也不含与K3,3同胚的子图
    2 一个图是平面图当且仅当它没有可以收缩到与k5同±胚的子图,也没有可以收缩到K3,3同胚的子图

    展开全文
  • 1. 类 #ifndef GRAPH_H #define GRAPH_H const int maxvertex=100; //最多可以有100个顶点 const int maxedge=1000; //最多可以有1000条边 const double maxweight=1e10; //权值最大值 #include #include #...
  • 二部图(染色法判断二部图)

    千次阅读 2017-09-10 21:06:58
    二部图又叫二分图,我们不是求它的二分图最大匹配,也不是完美匹配,也不是多重匹配,而是证明一个图是不是二部图。证明二部图可以用着色来解决,即我们可以用两种颜色去涂一个图,使的任意相连的两个顶点颜色不相同...
  • 二分图判定

    千次阅读 2014-06-14 17:31:47
     二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),...
  • 图论_二部图

    2020-04-09 15:54:31
    二部图的概念
  • 图论: 二部图的匹配问题 总结

    千次阅读 2020-04-13 17:44:09
    2. 二部图的匹配与覆盖 3. Tutte定理 1. 图的匹配与Berge定理 1.1 图的匹配的相关概念 匹配M: 不含自环;任意两边无公共顶点; M饱和点: 匹配M中某条边的顶点; M非饱和点: 不是M中某条边的顶点; 极大匹配...
  • 二部图判断

    千次阅读 2013-09-24 22:15:53
    这个问题其实就是一个离散数学里二部图问题。解决办法是利用图着色的方法,即利用广度优先搜索(BFS)对图中每个节点用两种颜色进行着色,相邻节点要为不同颜色,如果最后着色成功,则是可以划分为两组的,否则不行...
  • 二部图 Hall定理

    千次阅读 2018-12-06 21:31:20
    hall定理是判定二部图是否存在完备匹配的定理 定理内容 设二分图中G=&amp;amp;amp;lt;V1,V2,E&amp;amp;amp;gt;中 |V1|=m&amp;amp;amp;lt;=|V2|=n,G中存在从V1到V2的完备匹配当且仅当V1中任意k(k=1,2,…,...
  • 根据Hall定理,二部图G=(V1,V2;E)有一个浸润V1匹配的充要条件是:SV1,N(S)∩V2≥S,即V2中与V1的任一子集S相邻的顶点数不小于S中的顶点数。当V1中的顶点数较多时,用该条件判定较为困难。本文给出了一个基于顶点度判别...
  • 题目大意:给出田鼠数目与地洞数目,...解题策略:简单二部图,答案 = 田鼠总数-(田鼠——地洞)二部图最大匹配数,邻接表实现。 /* UVA 10080 Gopher II AC by J_Dark ON 2013/4/19 Time 0.044s */ #
  • 【二分图判定】二分图染色

    千次阅读 2018-08-07 13:26:54
    二分图判定有两点。 1、图为连通图。 2、可以分为两个不同的点集。 二分图的另一种等价的说法是,可以把每个节点着以黑色和白色之一,使得每条边的两个端点颜色不同.不难发现,非连通的图是二分图当且仅当每个...
  • 编程算法 - 二分图判定 代码(C)

    千次阅读 2014-07-27 11:39:26
    二分图判定 代码(C)本文地址: http://blog.csdn.net/caroline_wendy题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同. 是否能最多用2种颜色进行染色. 没有重边和闭环.即二分图...
  • 二分图判定 C++

    千次阅读 2018-07-24 15:09:42
    判定是否存在一个合理的染色方案,使得我们所建立的无向满足每一条边两端的顶点颜色都不相同 。 那么,我们不妨将所有的点初始为未染色的状态。随机选择一个点,将其染成白色。再以它为起点,将所有相邻的点染...
  • 二分判定

    2014-08-05 23:23:57
    二分:对于无向,如果节点 着色法:
  • 二分图判定和割顶与桥的判断
  • 题目: 题解目录前言一、题目陈述、解决思路三、代码实现总结 前言 一、题目陈述 、解决思路 三、代码实现 总结
  • 二分图一?二分图判定(不连通的)

    千次阅读 2017-09-10 21:13:32
    二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Nettle,从这个星期开始由我来完成我们的Weekly。 新年回家,又到了一年一度大龄剩男剩女的相亲时间。...
  • 二分的定义和判定

    万次阅读 多人点赞 2018-08-08 17:36:26
     二分图也称二部图,是图论里的一种特殊模型,也是一种特殊的网络流。其最大的特点在于,可以将图里的顶点分为两个集合,且集合内的点没有直接关联,如下图所示。 图1 理论判断 如果某个图为二分图,那么它至少...
  • 判定是否存在一个合理的染色方案,使得我们所建立的无向满足每一条边两端的顶点颜色都不相同 。 那么,我们不妨将所有的点初始为未染色的状态。随机选择一个点,将其染成白色。再以它为起点,将所有相邻的点染...
  • 二分判定(C语言)

    千次阅读 2016-12-10 20:46:43
    二分图又称为二部图,其定义是:设G=(V,E)是一个无向图。如顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属两个不同的子集。则称图G为二分图。也就是说在二分图中,顶点可以分为两个集合X和...
  • for (j = 1; j ; j++) { if (Pub.color[j] == -1) Pub.color[j] = 0; for (i = 1; i ; i++) { if (Pub.graphs[j, i] == 1) { if (Pub.color[i] == -1) { Pub.color[i] = 1 - Pub.color[j];...
  • 上篇转发了关于二分的概念啥的,这篇来说一下,二分的染色法判定。 说一下思路吧。找寻所有没染色的顶点,染色,如果有发现相邻的连接点颜色相同了,则此构不成二分。全部染色完且没有相邻结点颜色相同则为...
  • 离散数学-图论相关

    千次阅读 2019-04-11 16:25:29
    文章目录图的基本概念无向图和有向图无向图有向图关联和度关联度握手定理简单图与完全图简单图通路、回路和图的连通性通路回路一些关于通路和回路的定理定理1定理2连通性割集二部图定义二部图判定Hall定理欧拉图...
  • UVa 10004 染色

    千次阅读 2015-02-01 01:14:47
    思路:二部图判定。其实通过题意思考,也可以发现,如果没有回路是可以的,如果有回路,而回路的顶点个数是偶数个也是可以的,是奇数个则不行。而这正是二部图的充要条件:无向图的所有回路长度都为偶数。 但这里...
  • 图像进行值化处理,值化算法主要分为两种类型,全局阈值法和局部阈值法全局阈值法是最为简单的处理方法,它采用单一的阈值对图像中所有像素点进行判定。最为著名的全局阈值法是Otsu(大律法)算法,它的核心...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,168
精华内容 5,267
关键字:

二部图的判定