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

/**
    二分图判定
    图的着色问题,最小着色数为二的图  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;
    for(int i=0;i<G[x].size();i++)
    {
        if(color[G[x][i]]==c)return false;
        if(color[G[x][i]]==0&&!dfs(G[x][i],-c))return false;
    }
    return true;
}
void solve()
{
    int i=0;
    for(i=0;i<n;i++)
    {
        if(color[i]==0)
        {
            if(!dfs(i,1))
            {
                printf("No\n");
                return ;
            }
        }
    }
    printf("Yes\n");
}
int main()
{
    int x,y,k;
    while(~scanf("%d",&n)&&n)
    {
        memset(color,0,sizeof(color));
        for(int i=0;i<n;i++)
        G[i].clear();
        scanf("%d",&k);
        for(int i=0;i<k;i++)
        {
            scanf("%d%d",&x,&y);
            G[x].push_back(y);
            G[y].push_back(x);
        }
        /*for(int i=0;i<n;i++)
        {
            for(int j=0;j<G[i].size();j++)
                printf("%d ",G[i][j]);
            system("pause");
            printf("\n");
        }*/
        solve();
    }
    return 0;
}
时间: 2024-08-07 00:12:53

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

二分图判定【图的搜索】

二分图判定 给定一个图,要给图上每个顶点染色,并且要使得相邻的顶点颜色不同.问是否能最多用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)

编程算法 - 二分图判定 代码(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_

uva 11396Claw Decomposotion(二分图判定)

 题目大意:给出一个简单无向图,每一个点的度为3.推断是否能将此图分解成若干爪的形式.使得每条边都仅仅出如今唯一的爪中. (点能够多次出如今爪中) 这道题实质上就是问这个图是否为二分图,dfs判定就可以 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #includ

二分图判定 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,则表示为负.在已知每个点正负值的基础上,绝对值符号可以去掉,差分约束模型便出来了.这里有个细