zoukankan      html  css  js  c++  java
  • 二分图判断-笔试题

    • 第四范式秋招笔试题

    题目

    - 给定一个具有n个顶点的图。要给图上每个顶点染色,并且要使相邻的顶点颜色不同。判断是否能最多用两种颜色进行染色。题目保证没有重边和自环。
     
    
    • 概念:把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需要的最小颜色数称为最小着色度。最小着色度为2的图称作二分图。

    • 分析:如果只用两种颜色,那么确定一个顶点的颜色之后,和它相邻的顶点的颜色也就确定了。因此,选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是否可以被2种颜色染色了。这个问题用深度优先搜索可以简单实现。

    解析

    // 一个简单的二分图的判断
     
    #include <iostream>
    #include <vector>
    #include <cstring>
    using namespace std;
     
    const int MAX_N =105;
    int V,E;
    // 使用邻接表模拟一张无向图
    vector<int> G[MAX_N];
    // 顶点的颜色,初始化为0,上色有两种颜色(0 or 1)
    int color[MAX_N];
     
    bool dfs(int v, int c)
    {
        color[v] = c;       // 把顶点染成c
        for(int i = 0; i < G[v].size(); i++)
        {
            // 如果当前点的相邻的点同色就返回false
            if(color[G[v][i]] == c)
                return false;
            // 如果当前点的邻点还没被染色,就染成-c
            if(color[G[v][i]] == 0 && !dfs(G[v][i], -c))
                return false;
        }
        // 如果当前点都被染过色,就返回true
        return true;
    }
     
    void solve()
    {
        for(int i = 0; i < V; i++)
        {
            if(color[i] == 0)
            {
                if(!dfs(i,1))
                {
                    cout << "no" << endl;
                    return;
                }
            }
        }
        cout << "yes" << endl;
    }
     
    int main()
    {
        cin >> V >> E;
        for(int i = 0; i < E;  i++)
        {
            int s, t;
            cin >> s >> t;
            G[s].push_back(t);
            G[t].push_back(s);  // 如果有向图则无需这一句
        }
        memset(color, 0, sizeof(color));
        solve();
     
        return 0;
    }
    
    
    

    参考

  • 相关阅读:
    MySQL8.0设置远程访问权限
    MySQL创建用户与授权
    input lable水平对齐
    jquery datagrid加载后仅选定第一行
    jquery隐藏按钮
    C# 添加excel批注
    在ashx中使用Server对象
    jquery 获取datagrid行数
    弹出窗体中加载页面
    【MySQL】MySQL零碎积累
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/9614299.html
Copyright © 2011-2022 走看看