hihocoder #1121 : 二分图一•二分图判定

二分图判断算法:

到此我们就得到了整个图的算法:

选取一个未染色的点u进行染色
遍历u的相邻节点v:若v未染色,则染色成与u不同的颜色,并对v重复第2步;若v已经染色,如果 u和v颜色相同,判定不可行退出遍历。
若所有节点均已染色,则判定可行。
注意:有个能存在多个不连通的子图

#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;
const int N = 10010;
vector<int>a[N];
int color[N];

bool dfs(int v)
{
    //printf("%d
",v);
    for(int i = 0; i < a[v].size(); i++)
    {
        int u = a[v][i];
        if(color[u] == -1)
        {
            color[u] = 1-color[v];
            dfs(u);
        }
        else if(color[u] == color[v])
        {
            return false;
        }
    }
    return true;
}

int main()
{
    int T;
    int n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&n,&m);
        for(int i = 0; i < N; i++)
            color[i] = -1;
        for(int i = 0; i < N; i++)
            a[i].clear();

        for(int i = 0; i < m; i++)
        {
            int u,v;
            scanf("%d %d",&u,&v);
            u--,v--;
            int flag = 0;
            for(int j = 0; j < a[u].size(); j++)
                if(a[u][j] == v)
                {
                    flag= 1;
                    break;
                }
            if(!flag && u!=v)
            {
                a[u].push_back(v);
                a[v].push_back(u);
            }
        }
        bool flag=true;
        for(int i = 0; i < n; i++)
        {
             if(color[i]!=-1) continue;
             color[i] = 1;

             flag = dfs(i);
             if(flag == false)
                break;
        }
        if(!flag)
            printf("Wrong
");
        else
            printf("Correct
");
    }
    return 0;
}

 
原文地址:https://www.cnblogs.com/zendu/p/4981034.html