本文涉及知识点
枚举 图论知识汇总
LeetCode 2242. 节点序列的最大得分
给你一个 n 个节点的 无向图 ,节点编号为 0 到 n - 1 。
给你一个下标从 0 开始的整数数组 scores ,其中 scores[i] 是第 i 个节点的分数。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] ,表示节点 ai 和 bi 之间有一条 无向 边。
一个合法的节点序列如果满足以下条件,我们称它是 合法的 :
序列中每 相邻 节点之间有边相连。
序列中没有节点出现超过一次。
节点序列的分数定义为序列中节点分数之 和 。
请你返回一个长度为 4 的合法节点序列的最大分数。如果不存在这样的序列,请你返回 -1 。
示例 1:
输入:scores = [5,2,9,8,4], edges = [[0,1],[1,2],[2,3],[0,2],[1,3],[2,4]]
输出:24
解释:上图为输入的图,节点序列为 [0,1,2,3] 。
节点序列的分数为 5 + 2 + 9 + 8 = 24 。
观察可知,没有其他节点序列得分和超过 24 。
注意节点序列 [3,1,2,0] 和 [1,0,2,3] 也是合法的,且分数为 24 。
序列 [0,3,2,4] 不是合法的,因为没有边连接节点 0 和 3 。
示例 2:
输入:scores = [9,20,6,4,11,12], edges = [[0,3],[5,3],[2,4],[1,3]]
输出:-1
解释:上图为输入的图。
没有长度为 4 的合法序列,所以我们返回 -1 。
提示:
n == scores.length
4 <= n <= 5 * 104
1 <= scores[i] <= 108
0 <= edges.length <= 5 * 104
edges[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
不会有重边。
枚举
枚举第二个、第三个节点。
第一步:vScore记录各节点邻邻接点的分数。
第二步:对vScore[i]降序排序。
第三步:枚举各边(u,v),如果u或v只有一个临接点,则忽略。
vScore[u][0]等于scores[v],则第一个节点的分数是:vScore[v][1],否则是vScore[v][0]。
第四个节点类似。
代码
核心代码
class Solution {
public:int maximumScore(vector<int>& scores, vector<vector<int>>& edges) {vector<vector<pair<int,int>>> ss(scores.size());for (const auto& v : edges) {ss[v[0]].emplace_back(scores[v[1]],v[1]);ss[v[1]].emplace_back(scores[v[0]],v[0]);}for (auto& v : ss) {sort(v.begin(), v.end(), greater<>());}int ret = -1;for (const auto& v : edges) {if ((ss[v[0]].size() <= 1) || (ss[v[1]].size() <= 1)) { continue; }const auto& v0 = ss[v[0]];const auto& v1 = ss[v[1]];for (int i = 0; i < min(3,(int) v0.size()); i++) {for (int j = 0; j < min(3, (int)v1.size()); j++) {if (v0[i].second == v1[j].second) { continue; }if (v0[i].second == v[1]) { continue; }if (v[0] == v1[j].second) { continue; }int cur = scores[v[0]] + scores[v[1]]+ v0[i].first + v1[j].first;ret = max(ret, cur);}} }return ret;}
};
单元测试
template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{vector<int> scores;vector<vector<int>> edges;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){scores = { 5,2,9,8,4 }, edges = { {0,1},{1,2},{2,3},{0,2},{1,3},{2,4} };auto res = Solution().maximumScore(scores, edges);AssertEx(24, res);}TEST_METHOD(TestMethod01){scores = { 9,20,6,4,11,12 }, edges = { {0,3},{5,3},{2,4},{1,3} };auto res = Solution().maximumScore(scores, edges);AssertEx(-1, res);}};
}
扩展阅读
视频课程
先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176
相关推荐
我想对大家说的话 |
---|
《喜缺全书算法册》以原理、正确性证明、总结为主。 |
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。 |
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注 |
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
如果程序是一条龙,那算法就是他的是睛 |
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。