首页 > 编程语言 >[LeetCode] 882. Reachable Nodes In Subdivided Graph

[LeetCode] 882. Reachable Nodes In Subdivided Graph

时间:2023-02-21 07:44:06浏览次数:34  
标签:882 Subdivided int Graph edge edges graph new nodes

You are given an undirected graph (the "original graph") with n nodes labeled from 0 to n - 1. You decide to subdivide each edge in the graph into a chain of nodes, with the number of new nodes varying between each edge.

The graph is given as a 2D array of edges where edges[i] = [ui, vi, cnti] indicates that there is an edge between nodes ui and vi in the original graph, and cnti is the total number of new nodes that you will subdivide the edge into. Note that cnti == 0 means you will not subdivide the edge.

To subdivide the edge [ui, vi], replace it with (cnti + 1) new edges and cnti new nodes. The new nodes are x1x2, ..., xcnti, and the new edges are [ui, x1][x1, x2][x2, x3], ..., [xcnti-1, xcnti][xcnti, vi].

In this new graph, you want to know how many nodes are reachable from the node 0, where a node is reachable if the distance is maxMoves or less.

Given the original graph and maxMoves, return the number of nodes that are reachable from node 0 in the new graph.

 

Example 1:

Input: edges = [[0,1,10],[0,2,1],[1,2,2]], maxMoves = 6, n = 3
Output: 13
Explanation: The edge subdivisions are shown in the image above.
The nodes that are reachable are highlighted in yellow.

Example 2:

Input: edges = [[0,1,4],[1,2,6],[0,2,8],[1,3,1]], maxMoves = 10, n = 4
Output: 23

Example 3:

Input: edges = [[1,2,4],[1,4,5],[1,3,1],[2,3,4],[3,4,5]], maxMoves = 17, n = 5
Output: 1
Explanation: Node 0 is disconnected from the rest of the graph, so only node 0 is reachable.

 

Constraints:

  • 0 <= edges.length <= min(n * (n - 1) / 2, 10^4)
  • edges[i].length == 3
  • 0 <= ui < vi < n
  • There are no multiple edges in the graph.
  • 0 <= cnti <= 10^4
  • 0 <= maxMoves <= 10^9
  • 1 <= n <= 3000

 

Dijkstra generates a spanning tree, not necessarily MST

 

Solution

1. Build graph based on each edge's subdivide cnt, edge weight = subdivide cnt + 1.

2. Run dijkstra, compute shortest distance from node 0 to all nodes. Keep track all edges that lead to a node with edge sum <= maxMoves and save them in a Set S.

3. compute final results in 2 parts:

(a). add all original nodes whose shortest path from node 0 <= maxMoves;

(b) For newly added nodes, check each edge:

if an edge is in S, then all the newly added nodes on this edge should be added;

if an edge is not in S, then check its two nodes U and V. if dist[U] <= maxMoves, add the according newly added nodes that are reachable from U. Do the same from V. Be careful to not add the same nodes twice!

 

class Solution {
    public int reachableNodes(int[][] edges, int maxMoves, int n) {
        int m = edges.length;
        List<int[]>[] g = buildGraph(edges, n);
        int[] d = new int[n];
        Arrays.fill(d, Integer.MAX_VALUE);
        d[0] = 0;
        PriorityQueue<int[]> q = new PriorityQueue<>(Comparator.comparingInt(e->e[1]));
        boolean[] processed = new boolean[n];
        q.add(new int[]{0, 0, -1});
        Set<Integer> included = new HashSet<>();
        while(!q.isEmpty()) {
            int[] curr = q.poll();
            if(processed[curr[0]]) continue;
            processed[curr[0]] = true;
            if(curr[1] <= maxMoves) {
                included.add(curr[2]);
            }            
            for(int[] next : g[curr[0]]) {
                if(d[curr[0]] + next[1] < d[next[0]]) {
                    d[next[0]] = d[curr[0]] + next[1];
                    q.add(new int[]{next[0], d[next[0]], next[2]});
                }
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++) {
            if(d[i] <= maxMoves) {
                ans++;
            }
        }
        for(int i = 0; i < m; i++) {
            if(included.contains(i)) {
                ans += edges[i][2];
            }
            else {
                int cnt = 0;
                if(d[edges[i][0]] < maxMoves) {
                    cnt += Math.min(edges[i][2], maxMoves - d[edges[i][0]]);
                }
                if(d[edges[i][1]] < maxMoves) {
                    cnt += Math.min(edges[i][2], maxMoves - d[edges[i][1]]);
                }
                ans += Math.min(cnt, edges[i][2]);
            }
        }
        return ans;
    }
    private List<int[]>[] buildGraph(int[][] edges, int n) {
        List<int[]>[] g = new List[n];
        for(int i = 0; i < n; i++) {
            g[i] = new ArrayList<>();
        }
        for(int i = 0; i < edges.length; i++) {
            g[edges[i][0]].add(new int[]{edges[i][1], edges[i][2] + 1, i});
            g[edges[i][1]].add(new int[]{edges[i][0], edges[i][2] + 1, i});
        }
        return g;
    }
}

 

标签:882,Subdivided,int,Graph,edge,edges,graph,new,nodes
From: https://www.cnblogs.com/lz87/p/17139602.html

相关文章

  • cartographer-glass:2D Graph SLAM框架在玻璃环境使用LiDAR
    摘要——本算法用于检测和包含玻璃物体基于优化的SLAM算法。当激光作为主要的外部感知传感器时,玻璃物体不能正确被探测到。当入射光主要穿过玻璃物体或反射离开光源时,会发......
  • GraphQL (三) Authentication 和 Authorication
    本文介绍GraphQL中的Authenication和Authorication参考:https://graphql.org/learn/authorization/https://www.apollographql.com/docs/apollo-server/security/authen......
  • Silicon Graphics Image (SGI)
    SiliconGraphicsImage (SGI)orthe RGBfileformat isthenative raster graphicsfileformat for SiliconGraphics workstations.[3] Theformatwasinv......
  • Satellite Photographs
       SatellitePhotographsFarmerJohnpurchasedsatellitephotosofWxHpixelsofhisfarm(1<=W<=80,1<=H<=1000)andwishestodeterminethelarges......
  • 让function_graph输出返回值
    最近在分析内核问题时用了function_graph,用它来分析为什么应用的某个系统调用会返回错误。在分析的时候,根据function_graph的输出确定代码执行流程,但是有时又需要知道函数......
  • .Net6 + GraphQL + MongoDb 实现Subscription监听功能
    介绍查询、添加、修改我们已经演示了,我们来看下订阅。订阅大家可以理解为音乐软件,我们用户=>订阅音乐频道<=服务发送新的音乐通知到频道。有新的通知进入频道后,频......
  • 基于Graph-Cut算法的图像目标分割matlab仿真
    1.算法描述       Graphcuts是一种十分有用和流行的能量优化算法,在图像处理领域普遍应用于前后背景分割(Imagesegmentation)、立体视觉(stereovision)、抠图(Imagem......
  • P8827 [传智杯 #3 初赛] 森林 题解
    题意有一颗树,每个点有一个点权\(v\)。现在要对这棵树进行\(m\)次以下三种操作之一:删除一条边。修改一个点的点权。查询一个点\(u\)所在的树的点权之和。......
  • [视觉] Decompose Planar Homography Matrix
    DecomposePlanarHomographyMatrix本篇解释下平面物体的homography矩阵分解,即得到相机的位姿,来分析相机是否正确放置,在机器视觉中有着较为广泛的应用。原理我们已知平......
  • 云小课|使用SpringBoot快速构建FunctionGraph HTTP函数
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......