zoukankan      html  css  js  c++  java
  • 二分图学习——基础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
    ");
                    return;
                }
            }
        }
        printf("Yes
    ");
        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函数找不到可以染色的点结束

  • 相关阅读:
    洛谷 P3808 【模板】AC自动机(简单版) 题解
    O3优化模板
    洛谷 P3909 异或之积 题解
    洛谷 P3870 [TJOI2009]开关 题解
    洛谷 P1891 疯狂LCM 题解
    洛谷 P5221 Product 题解
    洛谷 P2568 GCD 题解
    洛谷 P5639 【CSGRound2】守序者的尊严 题解
    扩展kmp板子
    [JZOJ3167] 【GDOI2013模拟3】查税
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8903523.html
Copyright © 2011-2022 走看看