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 * 算法

图论总结篇

深搜与广搜

并查集

最小生成树

拓扑排序

最短路算法

相关推荐
灵感__idea1 天前
Hello 算法:贪心的世界
前端·javascript·算法
camellias_1 天前
【无标题】
java·tomcat
咸鱼2.01 天前
【java入门到放弃】需要背诵
java·开发语言
澈2071 天前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
椰猫子1 天前
Java:异常(exception)
java·开发语言
ambition202421 天前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_1 天前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi1 天前
前缀和差分
算法·图论
代码旅人ing1 天前
链表算法刷题指南
数据结构·算法·链表
Yungoal1 天前
常见 时间复杂度计算
c++·算法