comments | difficulty | edit_url | rating | source | tags | ||||
---|---|---|---|---|---|---|---|---|---|
true |
困难 |
2304 |
第 76 场双周赛 Q4 |
|
给你一个 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
- 不会有重边。
枚举中间边
class Solution:
def maximumScore(self, scores: List[int], edges: List[List[int]]) -> int:
g = defaultdict(list)
for a, b in edges:
g[a].append(b)
g[b].append(a)
for k in g.keys():
g[k] = nlargest(3, g[k], key=lambda x: scores[x])
ans = -1
for a, b in edges:
for c in g[a]:
for d in g[b]:
if b != c != d != a:
t = scores[a] + scores[b] + scores[c] + scores[d]
ans = max(ans, t)
return ans
class Solution {
public int maximumScore(int[] scores, int[][] edges) {
int n = scores.length;
List<Integer>[] g = new List[n];
Arrays.setAll(g, k -> new ArrayList<>());
for (int[] e : edges) {
int a = e[0], b = e[1];
g[a].add(b);
g[b].add(a);
}
for (int i = 0; i < n; ++i) {
g[i].sort((a, b) -> scores[b] - scores[a]);
g[i] = g[i].subList(0, Math.min(3, g[i].size()));
}
int ans = -1;
for (int[] e : edges) {
int a = e[0], b = e[1];
for (int c : g[a]) {
for (int d : g[b]) {
if (c != b && c != d && a != d) {
int t = scores[a] + scores[b] + scores[c] + scores[d];
ans = Math.max(ans, t);
}
}
}
}
return ans;
}
}