二分图判定【图的搜索】

二分图判定

给定一个图,要给图上每个顶点染色,并且要使得相邻的顶点颜色不同。问是否能最多用2种颜色进行染色?

参考如下:

Source Code:
#include <iostream>
#include <vector>

using namespace std;

vector<int> Edge[1010];
int colorArr[1010];

void initColorArr(int length){
    for(int i=0;i<=length;++i)
        colorArr[i]=0;
}

bool DFS(int index,int color){
    colorArr[index]=color;
    for(int cnt=0;cnt<Edge[index].size();++cnt){
        if(colorArr[Edge[index][cnt]]==color)
            return false;
        if(colorArr[Edge[index][cnt]]==0){
            return DFS(Edge[index][cnt],-color);
        }
    }
    return true;
}

int main(){
    int N,M;  //n为顶点数,m为边数
    int edge_a,edge_b;
    bool flag;
    while(cin>>N>>M){
        for(int index=0;index<N;++index)
            Edge[index].clear();
        initColorArr(N);
        for(int index=0;index<M;++index){
            cin>>edge_a>>edge_b;
            Edge[edge_a].push_back(edge_b);
            Edge[edge_b].push_back(edge_a);
        }
        flag=true;
        for(int index=0;index<N;++index){
            if(colorArr[index]==0){
                if(DFS(index,1)==false){
                    cout<<"No"<<endl;
                    flag=false;
                    break;
                }
            }
        }
        if(flag)
            cout<<"Yes"<<endl;
    }
    return 0;
}
时间: 2024-10-22 00:13:21

二分图判定【图的搜索】的相关文章

二分图判断 (图的搜索)

二分图,又叫做双分图 二部图 偶图,指顶点可以分成两个不相交的集U和V,使得在同一个集内的顶点不相邻(没有共同边)的图. 无向图G为二分图的充要条件是,G至少有两个顶点,且其所有回路的长度均为偶数. 给定一个具有N个顶点的图,判断其是不是二分图(如着色问题,最小着色数为2的图就是二分图),可以用DFS处理.选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是否可以被2种颜色染色了. 代码如下 #include <cstdio> #include <cstring> #incl

图的搜索---二分图判定

/** 二分图判定 图的着色问题,最小着色数为二的图 DFS */ #include "cstdio" #include "cstring" #include "cstdlib" #include "vector" #define MAX 1002 std::vector<int> G[MAX]; int color[MAX]; int n; bool dfs(int x,int c) { color[x]=c;

编程算法 - 二分图判定 代码(C)

二分图判定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同.  是否能最多用2种颜色进行染色. 没有重边和闭环. 即二分图问题. 使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 如果相邻边被染色过, 且相同, 则图不是二分图; 如果所有边都被染色, 并且互不相同, 则是二分图. 进行多次搜索, 避免非连通图. 代码: /* * CppPrim

hdoj 3478 Catch(二分图判定+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 思路分析:该问题需要求是否存在某一个时刻,thief可能存在图中没一个点:将该问题转换为图论问题即为判断该图是否为一个连通图且不为二分图: (1)二分图的性质:对于无向图G=(V, E),如果可以将图中的点划分为两个不相交的点集X与Y = V - X(V为点集),使得图中所有的边邻接的两个点分别存在集合X与集合Y中,则称该图G为二分图: (2) 二分图判定算法:二分图一种判定方法是给图中的每一

#1121 : 二分图一?二分图判定 (HIHOCoder +二分图的判定)

#1121 : 二分图一?二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Nettle,从这个星期开始由我来完成我们的Weekly. 新年回家,又到了一年一度大龄剩男剩女的相亲时间.Nettle去姑姑家玩的时候看到了一张姑姑写的相亲情况表,上面都是姑姑介绍相亲的剩男剩女们.每行有2个名字,表示这两个人有一场相亲.由于姑姑年龄比较大了记性不是太好,加上相亲的人很多,所以姑姑一时也想不起来其中有些人的性别.因此她拜托我检查一

[Algorithms]图的搜索

未完待续 知道图的存储,DFS,BFS 二分图判定 1 //二分图判定 2 //给定一个有n个顶点的图,给图上每个顶点染色,要使相邻顶点颜色不同,是否能用最多2种颜色染色?无重边和自环. 3 //只用两种颜色,确定一个顶点的颜色后,和它相邻的顶点的颜色随之确定的那个. 4 //选择任意一个顶点出发,依次确定相邻顶点的颜色,判断是否可被2种颜色染色,深度优先搜索 5 6 //输入 7 vector<int> G[MAX_V];//图 8 int V; //顶点数 9 int color[MAX_

二分图判定 nyoj1015(模板)

题目:点击打开链接nyoj1015 分析:题意很清楚,就是让判断一个图是不是二分图,思路当然就是染色法,首先给一个顶点然色,然后与它相邻的顶点全部染相反的颜色,如果过程中发现要染的点已经染色了,而且是和现在点相同的颜色的话,那么就说明不是一个二分图. 其实就是广搜模板 #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector&g

COJ 0578 4019二分图判定

4019二分图判定 难度级别: B: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给定一个具有n个顶点(顶点编号为0,1,……,n-1)的图,要给图上每个顶点染色,并且要使相邻的顶点颜色不同.问是否能最多用2种颜色进行染色?测试数据保证没有重边和自环. 输入 第一行包括两个数n和k,分别表示图的顶点数和边数,接下来有k行,每行有两个整数m1和m2,表示顶点m1和m2间有一条无向边.各行的整数间用一个空格分隔. 输出 如果

[hdu4598]二分图判定,差分约束

题意: 给一个图,问能否给每个点分配一个实数值,使得存在一个数实数T,所有点满足:|value(i)| < T 且 u,v之间有边<=> |value(u)-value(v)| >= T.(注意等价符号) 思路: 由性质可得,两相邻点的分配的值的符号相反,于是先对原图做一个二分图判定,如果是非二分图,则无解.对二分图染色后,假设color[i]=1,则表示i点为正值,color[i]=-1,则表示为负.在已知每个点正负值的基础上,绝对值符号可以去掉,差分约束模型便出来了.这里有个细