前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是七月集训第二十七天:图🔥🔥🔥🔥
一、练习题目
二、算法思路
- 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、题目很绕,这是一个有向无环图,建立反向边。