美团2024春招第9场算法第二题

测试用例

3 3

1 2 3

3 4 5

4 3 6

目标答案:19

最短路问题

考虑使用dijkstra

import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;

public class mt2 {
    static int n,m;
    static StreamTokenizer stk = new StreamTokenizer(new java.io.BufferedReader(new java.io.InputStreamReader(System.in)));

    static int[][] graph = new int[1050][1050];
    static boolean[][] vis = new boolean[1050][1050];
    //构建一个点图
    static int getInt(){
        try{
            stk.nextToken();
            return (int)stk.nval;
        }catch(Exception e){
            return -1;
        }
    }

    public static void main(String[] args) {
        n = getInt();
        m = getInt();
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                graph[i][j] = getInt();
            }
        }
        node end = new node((1+n)/2, (1+m)/2, graph[(1+n)/2][(1+m)/2]);//在中点相见
        long sum = 0;
        node start = new node(1,1,graph[1][1]);
        sum += dijkstra(start,end);
        start = new node(n,m,graph[n][m]);
        sum += dijkstra(start,end);
        System.out.println(sum - graph[(1+n)/2][(1+m)/2]);//因为中心点会被同时算两次,去重
    }
    static class node{
        int x;
        int y;
        int value;
        public node(int x, int y, int value){
            this.x = x;
            this.y = y;
            this.value = value;
        }
    }
    static long dijkstra(node start,node end){{
        long sum = start.value;
            PriorityQueue<node> pq = new PriorityQueue<>((a,b)->b.value-a.value);
            pq.add(start);
            while(!pq.isEmpty()){
                node now = pq.poll();
                if(now.x == end.x && now.y == end.y) break;//检查是否到达终点
                if(vis[now.x][now.y])continue;
                vis[now.x][now.y] = true;//标记访问
                int[][] path = {{0,1},{0,-1},{1,0},{-1,0}};//上下左右
                int x = now.x;
                int y = now.y;
                long max = Integer.MIN_VALUE;
                long max_value = 0;
                for(int i = 0; i < 4;i++){
                    int idx = x + path[i][0];
                    int idy = y + path[i][1];
                    if(max < graph[idx][idy] + sum){//如果当前点+总和大于最大值,则更新最大值
                        max = graph[idx][idy] + sum;
                        if(!vis[idx][idy]){
                            max_value = graph[idx][idy];//保存当前点的值,必须是未访问过的
                        pq.add(new node(idx,idy,graph[idx][idy]));//添加进队列中
                        }
                    }
                }

                sum += max_value;
            }
            return sum;
    }
    }
}

关于dijkstra堆优

static void Dijkstra(int s){//堆优化版本
        Arrays.fill(dist,Integer.MAX_VALUE);
        dist[s] = 0;
        //压入格式为{v,w}
        PriorityQueue<node> que = new PriorityQueue<>((a,b) -> a.weight - b.weight);//从小到大使用优先队列

        que.offer(new node(s,0));

        while(!que.isEmpty()){
            node now_point = que.poll();
            int u = now_point.ponit;
            int w = now_point.weight;
            if(vis[u]) continue;//将该点置为已访问
            vis[u] = true;
            //遍历该点的所有邻接点
            for(int i = head[u]; i != -1; i = edges[i].next){;
                int v = edges[i].to;//到达点
                //如果dist[到达点] > 当前点的最短距离+到达下一个点的距离 置换
                if(dist[v] > w + edges[i].weight){
                    dist[v] = w + edges[i].weight;
                    if(!vis[v]){
                        que.offer(new node(v,dist[v]));
                    }
                }
            }
        }
    }

已经写的很详细了,不在赘述

#美团2024春招#
全部评论
动态规划可以吗?
点赞 回复 分享
发布于 2024-05-11 16:28 安徽

相关推荐

不愿透露姓名的神秘牛友
07-01 17:00
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务