day 60 图论part11

文章目录

  • [Floyd 算法精讲 97. 小明逛公园](#Floyd 算法精讲 97. 小明逛公园)
  • [A * 算法精讲 (A star算法)127. 骑士的攻击](#A * 算法精讲 (A star算法)127. 骑士的攻击)
  • 最短路算法总结篇
  • 图论总结篇

Floyd 算法精讲 97. 小明逛公园

注意三维dp数组的含义,从i到j需要能够经过k个节点的最短路径。

java 复制代码
import java.util.*;

class Main {
    public static int MAX_VAL = 10005;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][][] dp = new int[n + 1][n + 1][n + 1];
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=n; j++) {
                for(int k = 0; k <= n; k++) {
                    dp[i][j][k] = MAX_VAL;
                    
                }
            }
        }
        for (int i = 0; i < m; i++) {
            int u = sc.nextInt();
            int v = sc.nextInt();
            int w = sc.nextInt();
            dp[u][v][0] = w;
            dp[v][u][0] = w;
        }
        int q = sc.nextInt();
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <=n; i++) {
                for (int j = 1;j <= n; j++) {
                    dp[i][j][k] = Math.min(dp[i][j][k - 1], dp[i][k][k - 1] + dp[k][j][k - 1]);
                }
            }
        }
        for (int i = 0; i < q; i++) {
            int src = sc.nextInt();
            int dst = sc.nextInt();
            if (dp[src][dst][n] == MAX_VAL) {
                System.out.println(-1);
            }
            else {
                System.out.println(dp[src][dst][n]);
            }
        }

    }
}

A * 算法精讲 (A star算法)127. 骑士的攻击

定义一个启发式函数来优化BFS算法。

java 复制代码
import java.util.*;


public class Main {
    private static final int[][] MOVES = {
        {1, 2}, {2, 1}, {-1, 2}, {2, -1},
        {1, -2}, {-2, 1}, {-1, -2}, {-2, -1}
    };
    static class Node implements Comparable<Node> {
        int x, y, steps;
        double priority;

        Node(int x, int y, int steps, double priority) {
            this.x = x;
            this.y = y;
            this.steps = steps;
            this.priority = priority;
        }

        @Override
        public int compareTo(Node other) {
            return Double.compare(this.priority, other.priority);
        }
    }
    private static double getDistance(int x1, int y1, int x2, int y2) {
        return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
    }

    public static int aStar(int startX, int startY, int endX, int endY) {
        if (startX == endX && startY == endY) return 0;
        PriorityQueue<Node> pq = new PriorityQueue<>();

        Map<String, Integer> minSteps = new HashMap<>();

        String startKey = startX + "," + startY;
        pq.add(new Node(startX, startY, 0, getDistance(startX, startY, endX, endY)));
        minSteps.put(startKey, 0);


        while (!pq.isEmpty()) {
            Node curr = pq.poll();
            if (curr.x == endX && curr.y == endY) {
                return curr.steps;
            }

            for (int[] move : MOVES) {
                int nextX = curr.x + move[0];
                int nextY = curr.y + move[1];
                if (nextX >= 1 && nextX <= 1000 && nextY >= 1 && nextY <= 1000) {
                    int nextSteps = curr.steps + 1;
                    double nextpriority = nextSteps + getDistance(nextX, nextY, endX, endY);
                    pq.add(new Node(nextX, nextY, nextSteps, nextpriority));
                }
             }
        }
        return -1;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            int a1 = sc.nextInt();
            int b1 = sc.nextInt();
            int a2 = sc.nextInt();
            int b2 = sc.nextInt();
            System.out.println(aStar(a1, b1, a2, b2));
        }
    }
 }

最短路算法总结篇

dijkstra朴素版

dijkstra堆优化版

Bellman_ford

Bellman_ford 队列优化算法(又名SPFA)

bellman_ford 算法判断负权回路

bellman_ford之单源有限最短路

Floyd 算法精讲

启发式搜索:A * 算法

图论总结篇

深搜与广搜

并查集

最小生成树

拓扑排序

最短路算法

相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot