力扣——6262. 图中最大星和

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

力扣——6262. 图中最大星和

6262. 图中最大星和

给你一个 n 个点的无向图,节点从 0n - 1 编号。给你一个长度为 n 下标从 0 开始的整数数组 vals ,其中 vals[i] 表示第 i 个节点的值。

同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 aibi 之间有一条双向边。

星图 是给定图中的一个子图,它包含一个中心节点和 0 个或更多个邻居。换言之,星图是给定图中一个边的子集,且这些边都有一个公共节点。

下图分别展示了有 3 个和 4 个邻居的星图,蓝色节点为中心节点。

img

星和 定义为星图中所有节点值的和。

给你一个整数 k ,请你返回 至多 包含 k 条边的星图中的 最大星和

示例 1:

img

输入:vals = [1,2,3,4,10,-10,-20], edges = [[0,1],[1,2],[1,3],[3,4],[3,5],[3,6]], k = 2
输出:16
解释:上图展示了输入示例。
最大星和对应的星图在上图中用蓝色标出。中心节点是 3 ,星图中还包含邻居 14 。
无法得到一个和大于 16 且边数不超过 2 的星图。

示例 2:

输入:vals = [-5], edges = [], k = 0
输出:-5
解释:只有一个星图,就是节点 0 自己。
所以我们返回 -5

提示:

  • n == vals.length
  • 1 <= n <= 105
  • -104 <= vals[i] <= 104
  • 0 <= edges.length <= min(n * (n - 1) / 2``, 105)
  • edges[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 0 <= k <= n - 1

问题解析

把每个点与它相连的点都存入数组中,从中选取最大的k个点加上当前点自身的分数就是这一个星和的得分了。

注意,要是最大的k个点里有负数,不计入。

维护所有星图的最大值。

AC代码

class Solution {
public:
    vector<int>mymap[100050];
    int maxStarSum(vector<int>& vals, vector<vector<int>>& edges, int k) {
        int mx=-1e9,n=vals.size();
        for(auto&i:edges)
        {
            mymap[i[0]].push_back(vals[i[1]]);
            mymap[i[1]].push_back(vals[i[0]]);
        }
        for(int i=0;i<n;i++)
        {
            int ans=vals[i];
            sort(mymap[i].begin(),mymap[i].end(),greater<int>());
            for(int j=0;j<min(k,(int)mymap[i].size());j++)
            {
                if(mymap[i][j]<0)break;
                ans+=mymap[i][j];
            }
            mx=max(mx,ans);
        }
        return mx;
    }
};