首页 > 其他分享 >[leetcode 周赛] 100276. 最短路径中的边

[leetcode 周赛] 100276. 最短路径中的边

时间:2024-04-21 13:12:00浏览次数:20  
标签:周赛 100276 map int edge boolean new leetcode dp

solution

  • 使用dijkstra算法求出顶点0到每个顶点的最小距离dp[i]
  • 然后再从n-1开始遍历,如果dp[to] + w == dp[from] ,这条边符合条件

import java.util.*;

class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        boolean[] ans = solution.findAnswer(6, new int[][] {
                {0,1,4},
                {0,2,1},
                {1,3,2},{1,4,3},{1,5,1},{2,3,1},{3,5,3},{4,5,2}
        });
    }
    public boolean[] findAnswer(int n, int[][] edges) {
        List<int[]>[] g = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            g[i] = new ArrayList<>();
        }
        int[] dp = new int[n];
        Arrays.fill(dp,Integer.MAX_VALUE);

        Map<Integer,Map<Integer,Integer>> map = new HashMap<>();
        int index = 0;
        for (int[] edge : edges) {
            int from = edge[0];
            int to = edge[1];
            int w = edge[2];
            g[from].add(new int[]{to, w});
            g[to].add(new int[]{from, w});

            map.put(from, map.getOrDefault(from,new HashMap<>()));
            map.put(to, map.getOrDefault(to, new HashMap<>()));
            map.get(from).put(to, index);
            map.get(to).put(from, index);
            index++;
        }
        //bfs;
        dp[0] = 0;
        PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return dp[o1] - dp[02];
            }
        });
        queue.add(0);

        while (!queue.isEmpty()) {
            int from = queue.poll();
//            visited[from] = true;
            for (int[] edge: g[from]) {
                int to = edge[0];
                int w = edge[1];

                if(dp[to] > dp[from] + w) {
                    dp[to] = dp[from] + w;
                    queue.add(to);
                }
            }
        }
        System.out.println(dp[n-1]);
        //
        boolean[] answer = new boolean[edges.length];
        int curr = n - 1;
        ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
        boolean[] visited = new boolean[n];
//        visited[curr] = true;
        arrayDeque.add(curr);
        while (!arrayDeque.isEmpty()) {
          int from = arrayDeque.poll();
          for (int[] edge: g[from]) {
              int to = edge[0];
              int w = edge[1];

              if (dp[to] == dp[from] - w) {
//                  visited[to] = true;
                  int idx = map.get(from).get(to);
                  answer[idx] = true;
                  arrayDeque.add(to);
              }
          }
        }
        return answer;
    }
}

标签:周赛,100276,map,int,edge,boolean,new,leetcode,dp
From: https://www.cnblogs.com/fishcanfly/p/18148811

相关文章

  • LeetCode 2326. Spiral Matrix IV
    原题链接在这里:https://leetcode.com/problems/spiral-matrix-iv/description/题目:Youaregiventwointegers m and n,whichrepresentthedimensionsofamatrix.Youarealsogiventhe head ofalinkedlistofintegers.Generatean mxn matrixthatconta......
  • LeetCode 1424. Diagonal Traverse II
    原题链接在这里:https://leetcode.com/problems/diagonal-traverse-ii/description/题目:Givena2Dintegerarray nums,return allelementsof nums indiagonalorderasshowninthebelowimages.Example1:Input:nums=[[1,2,3],[4,5,6],[7,8,9]]Output:[1,4,......
  • LeetCode三则
    63.不同路径II一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空......
  • leetcode回文数
    给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为121-。因此......
  • LeetCode三则
    三道动态规划62.不同路径一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?输入:m=3,n=7输出:28输入:m=3,n=2输出:3解释:......
  • 牛客周赛 Round 40
    A小红进地下城点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings,t; cin>>s; cin>>t; if(s==t) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } return0;}B小......
  • LeetCode 面试经典150题---008
    ####151.反转字符串中的单词给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格......
  • LeetCode- 19 删除链表的倒数第N个节点
    题目地址https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/参考实现/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){t......
  • LeetCode三则
    198.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况......
  • LeetCode两则
    1137.第N个泰波那契数泰波那契序列Tn定义如下:T0=0,T1=1,T2=1,且在n>=0的条件下Tn+3=Tn+Tn+1+Tn+2给你整数n,请返回第n个泰波那契数Tn的值。示例1:输入:n=4输出:4解释:T_3=0+1+1=2T_4=1+1+2=4示例2:输入:n=25输出:1389537提示:0<=n......