二分图学习——基础dfs判断二分图

#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#define inf 0xfffffff

using namespace std;
const int maxn = 1e5 + 1e2;
const int maxp = 1e3 + 1e2;
//邻接表vector实现
vector<int> G[maxp];
int color[maxp];
int n,m;

void init()
{
    memset(color,0,sizeof(color));
    for(int i = 0;i <= n;i++)
    {
        G[i].clear();
    }
}

bool dfs(int s,int clr)
{
    color[s] = clr;

    for(int i  = 0;i < G[s].size();i++)
    {
        int to = G[s][i];

        if(color[to] == clr)return false;

        if(color[to] == 0 && !(dfs(to,-clr)))return false;

    }
    return true;
}
void solve()
{
    for(int i = 0;i < n;i++)
    {
        if(color[i] == 0)
        {
            if(!dfs(i,1))
            {
                printf("No\n");
                return;
            }
        }
    }
    printf("Yes\n");
    return;
}
int main()
{
    while(cin >> n >> m)
    {
        init();
        for(int i = 0;i < m;i++)
        {
            int a,b;
            cin>>a>>b;
            G[a].push_back(b);
            G[b].push_back(a);
        }
        solve();
    }

    return 0;
}


算法的大体思想是,对当前图进行二色染色只有两种颜色1 -1,从一个未染色的点开始,dfs进行染色,先染色当前点,然后对后续所有的点进行如下判断,如果下一个点已经染色且和当前颜色一样——》不是二分图,不一样——》不用管它忽略

如果下一个点没有染色呢,就尝试染色,如果染色失败,则回溯回来后任然是失败

染色成功,不管他,继续染色

以上是一个循环,直到solve函数找不到可以染色的点结束

posted @ 2018-04-21 20:14  Butterflier  阅读(473)  评论(0编辑  收藏  举报