二分图判断

图论--二分图判断

染色法

原理:使用两种颜色对图中的结点进行染色,若出现相邻结点颜色相同,则不是二分图(或偶图)。

选择任意一点开始,染为红色,并将相邻的结点染为蓝色。选择其中一个相邻的结点作为下一个结点重复这个过程,不过是把其相邻结点染为红色,直到全部染完色或者出现相邻结点同色的情况。(PS:如果相邻结点已经染色则不理会。)如果最后未出现相邻同色现象,则判断该图为二分图。

#include <iostream>
#include <vector>
#include <string.h>

using namespace std;
#define MAXSIZE 1001

vector<int> graph[MAXSIZE];
int color[MAXSIZE];

bool dfs(int u)
{
    int len = graph[u].size();
    for(int i=0;i<len;i++)
    {
        int v = graph[u][i];
        if(color[v] == 0)
        {
            color[v] = color[u]^1;
            if(!dfs(v))
                return false;
        }
        else if(color[u] == color[v])
            return false;
    }
    return true;
}
int main()
{
    int t,n,m,a,b;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        memset(graph,0,sizeof(graph));

        for(int i=1;i<=m;i++)
        {
            cin>>a>>b;
            graph[a].push_back(b);
            graph[b].push_back(a);
        }
        memset(color,0,sizeof(color));
        int flag = true;
        for(int i=1;i<=n;i++)
        {
            if(color[i]==0)
            {
                if(!dfs(i))
                {
                    flag = false;
                    break;
                }
            }
        }
        if(flag)cout<<"Yes\n"<<endl;
        else cout<<"No\n"<<endl;
    }
    return 0;
}

 

posted @ 2020-12-18 23:00  An2i  阅读(112)  评论(0编辑  收藏  举报