寒假刷题打卡第二十天 | 图(未完成)

真是跪了,打开leetcode一看,图标签类型的题目就没有easy的。

  1. 判断二分图
    核心思想:相邻的两个节点必须被分在两个不同的集合中。
    DFS
class Solution {
public:
    bool valid;
    vector<int> colored;
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        colored.assign(n,0);
        valid = true;
        for (int i=0;i<n && valid;i++)
        {
            if(colored[i]==0)
            {
                dfs(i, 1, graph);
            }
        }
        return valid;
    }

    void dfs(int i, int color, const vector<vector<int>>& graph)
    {
        colored[i] = color;  //别忘了这一句!!!!
        int nextColor = ((color == 1) ? 2 : 1);
        for(auto& node:graph[i]){
            if(colored[node]==0)
            {
                dfs(node, nextColor, graph);
                if(!valid)
                    return;
            }
            else if(colored[node]==color)
            {
                valid = false;
                return;
            }
        }
    }
};

BFS

class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        vector<int> allNodeColor(n,0);
        for(int i=0; i<n; i++)
        {
            if(allNodeColor[i]==0)  //别忘了加这一句。
            {
                queue<int> q;
                q.push(i);
                allNodeColor[i] = 1;
                while(!q.empty())
                {
                    int curNode = q.front();
                    q.pop();
                    int nextColor = ((allNodeColor[curNode]==1) ? 2 : 1);
                    for(int neigbor : graph[curNode])
                    {
                        if(allNodeColor[neigbor] == 0)
                        {
                            q.push(neigbor);
                            allNodeColor[neigbor] = nextColor;
                        }
                        else if(allNodeColor[neigbor] != nextColor)
                            return false;
                    }
                }
            }
        }
        return true;
    }
};
  1. 课程表
    官方解答写得很清楚,看答案吧。
    我待会儿再来慢慢看。
  2. 冗余连接

我放弃了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值