栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【模板题】染色法判定二分图(DFS遍历图)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【模板题】染色法判定二分图(DFS遍历图)

【题目描述】
给定一个 n n n个点 m m m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。

【输入格式】
第一行包含两个整数 n n n和 m m m。
接下来 m m m行,每行包含两个整数 u u u和 v v v,表示点 u u u和点 v v v之间存在一条边。

【输出格式】
如果给定图是二分图,则输出Yes,否则输出No。

【数据范围】
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1≤n,m≤105

【输入样例】

4 4
1 3
1 4
2 3
2 4

【输出样例】

Yes
#include 
#include 
#include 
using namespace std;

const int N = 100010, M = 200010;
int e[M], ne[M], h[N], idx;
int n, m;
int color[N];//color为0表示未染色,1和2表示两种不同的颜色

void add(int u, int v)
{
    e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}

bool dfs(int u, int c)
{
    color[u] = c;//将当前点染色
    for (int i = h[u]; ~i; i = ne[i])//遍历每条边
        if (color[e[i]] == c) return false;//若下一个点颜色和当前点一样则冲突
        else if (!color[e[i]])//如果下一个点未被染色
            if (!dfs(e[i], 3 - c)) return false;//3 - c可实现1和2的互换
    return true;
}

int main()
{
    cin >> n >> m;
    memset(h, -1, sizeof h);
    while (m--)
    {
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a);
    }
    bool flag = true;//标记是否为二分图
    //遍历每个点,检查是否染色,未染色则深搜进行染色
    for (int i = 1; i <= n; i++)
        if (!color[i])
            if (!dfs(i, 1))
            {
                flag = false;
                break;
            }
    if (flag) puts("Yes");
    else puts("No");
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302898.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号