zoukankan      html  css  js  c++  java
  • Leetcode(886)-可能的二分法

    给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。

    每个人都可能不喜欢其他人,那么他们不应该属于同一组。

    形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。

    当可以用这种方法将每个人分进两组时,返回 true;否则返回 false

    示例 1:

    输入:N = 4, dislikes = [[1,2],[1,3],[2,4]]
    输出:true
    解释:group1 [1,4], group2 [2,3]
    

    示例 2:

    输入:N = 3, dislikes = [[1,2],[1,3],[2,3]]
    输出:false
    

    示例 3:

    输入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
    输出:false

    思路:这是用染色图判断二分图的题目。

     判断二分图的常见方法是染色法: 开始对任意一未染色的顶点染色,之后判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色, 若已经染色且颜色和相邻顶点的颜色相同则说明不是二分图,若颜色不同则继续判断,bfs和dfs可以搞定!

    vector<int> v[2005];
        int color[2005];
        bool dfs(int a,int col){
            color[a]=col;
            int ok=1;
            for(auto it:v[a]){
                if(color[it]==-1){
                    ok&=dfs(it,col^1);
                }
                else if(color[it]!=(col^1)){
                    ok=0;
                }
            }
            return ok;
        }
        bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
            for(auto it:dislikes){
                v[it[0]].push_back(it[1]);
                v[it[1]].push_back(it[0]);
            }
            memset(color,-1,sizeof(color));
            int ok=1;
            for(int i=1;i<=N;i++){
                if(color[i]==-1)
                    ok&=dfs(i,1);
            }
            return ok;
        }
  • 相关阅读:
    linux中断处理浅析
    linux页面回收浅析
    linux线程同步浅析
    剖析一个由sendfile引发的linux内核BUG
    比memcpy更快的内存拷贝
    linux内核SMP负载均衡浅析
    sscanf,snprintf
    mysql中实现longblob数据流式读写
    sscanf
    substr复制字符串的一部分
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9495633.html
Copyright © 2011-2022 走看看