《七月集训》(第二十七天)——图

前言

        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        今天是七月集训第二十七天:🔥🔥🔥🔥
在这里插入图片描述

一、练习题目

        1791. 找出星型图的中心节点
        797. 所有可能的路径
        959. 由斜杠划分区域
        851. 喧闹和富有

二、算法思路

  • 1、1791. 找出星型图的中心节点:🔥第一题不难终于又有水题啦!
  • 2、797. 所有可能的路径:🔥暴力搜素递归,这个题目不难。
  • 3、959. 由斜杠划分区域:😢这个题目还得再看下
  • 4、851. 喧闹和富有:🔥🔥🔥🔥有向无环图,建立反向边。

三、源码剖析

// 1791. 找出星型图的中心节点
class Solution {
public:
    int findCenter(vector<vector<int>>& edges) {
        int n = edges[0][0];
        if (n == edges[1][0] || n == edges[1][1]) {
            return n;
        }
        return edges[0][1];
    }
};
  • 1、中间结点一定和所有结点相连,我们直接看两条边,其中一个两条边都有的结点就是中心结点。
// 797. 所有可能的路径
class Solution {
    vector<vector<int>> ret;
    vector<int> stk;
public:
    void dfs(int n, vector<vector<int>>& graph, int node) {
        if(node == n - 1) {
            ret.push_back(stk); //(1)
            return ;
        }
        for(int i = 0; i < graph[node].size(); ++i) {
            stk.push_back(graph[node][i]);
            dfs(n, graph, graph[node][i]); //(2)
            stk.pop_back(); //(3)
        }
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        ret.clear();
        stk.clear();
        int n = graph.size();
        stk.push_back(0);
        dfs(n, graph, 0);
        return ret;
    }
};
  • 1、暴力从0开始搜索到n-1结束;
  • 2、一层层的递归搜索;
  • 3、没搜索完一个结点记得要回退,不然答案重复记录有问题的。
// 1475. 商品折扣后的最终价格

  • 1、
// 851. 喧闹和富有
class Solution {
    vector<int> edges[510];
    int hash[510];

    void dfs(vector<int>& quiet, int u, int &ans) {
        if(hash[u]) {
            return ;
        }
        hash[u] = 1;
        if(quiet[u] < quiet[ans]) {
            ans = u;
        }

        for(int i = 0; i < edges[u].size(); ++i) {
            int v = edges[u][i];
            dfs(quiet, v, ans);
        }
    }
public:
    vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) {
        int n = quiet.size();
        for(int i = 0; i < n; i++) {
            edges[i].clear();
        }

        for(int i = 0; i < richer.size(); ++i) {
            int a = richer[i][0];
            int b = richer[i][1];
            edges[b].push_back(a);
        }

        vector<int> ret;
        for(int i = 0; i < n; ++i) {
            memset(hash, 0, sizeof(hash));
            int ans = i;
            dfs(quiet, i, ans);
            ret.push_back(ans);
        }
        return ret;
    }
};
  • 1、题目很绕,这是一个有向无环图,建立反向边。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值