返回介绍

solution / 2200-2299 / 2242.Maximum Score of a Node Sequence / README

发布于 2024-06-17 01:03:08 字数 3924 浏览 0 评论 0 收藏 0

2242. 节点序列的最大得分

English Version

题目描述

给你一个 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
  • 不会有重边。

解法

方法一:枚举中间边

枚举中间边 $(a, b)$,假设与 $a$ 相邻的点为 $c$,与 $b$ 相邻的点为 $d$。对于相邻点,取分数最大的三个点进行枚举。

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;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文