• 二分图学习——基础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函数找不到可以染色的点结束

  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8903523.html
Copyright © 2020-2023  润新知