Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan algoritma laluan terpendek graf menggunakan java

Bagaimana untuk melaksanakan algoritma laluan terpendek graf menggunakan java

王林
王林asal
2023-09-19 10:39:17736semak imbas

Bagaimana untuk melaksanakan algoritma laluan terpendek graf menggunakan java

Bagaimana untuk melaksanakan algoritma laluan terpendek graf menggunakan Java?

Tajuk: Gunakan algoritma Dijkstra untuk menyelesaikan masalah laluan terpendek bagi graf

Pengenalan:
Graf ialah struktur data penting dalam matematik diskret dan digunakan secara meluas dalam bidang sains maklumat dan sains komputer. Algoritma laluan terpendek untuk graf ialah salah satu teknologi utama untuk menyelesaikan banyak masalah praktikal, seperti penghalaan rangkaian, perancangan bandar, dsb. Artikel ini akan memperkenalkan cara menggunakan bahasa pengaturcaraan Java untuk melaksanakan algoritma Dijkstra yang terkenal untuk menyelesaikan masalah laluan terpendek graf.

1. Prinsip Algoritma:

Algoritma Dijkstra ialah algoritma tamak yang digunakan untuk mencari laluan terpendek dari titik permulaan ke bucu lain dalam graf berwajaran. Idea asas adalah untuk bermula dari titik permulaan, pilih bucu laluan terpendek semasa setiap kali, dan kemas kini laluan terpendek bagi bucu bersebelahannya. Proses ini diulang sehingga bucu sasaran dicapai, atau semua bucu telah dilawati.

2. Langkah-langkah algoritma:

  1. Memulakan jarak tatasusunan dist[] dan laluan tatasusunan laluan terpendek[], mulakan jarak dari titik permulaan ke bucu lain hingga tak terhingga, jarak dari titik permulaan ke dirinya sendiri kepada 0, dan mulakan tatasusunan laluan terpendek kepada mengosongkan;
  2. Jika jarak dari titik permulaan ke bucu w melalui bucu v lebih terus daripada titik permulaan Jika jarak ke bucu w lebih pendek, kemas kini dist[w] kepada dist[v] + panjang sisi (v, w), dan tambah v pada laluan[w];
  3. Ulang langkah 3 sehingga bucu sasaran dilawati atau semua bucu telah dilawati

      Bina laluan terpendek secara terbalik mengikut laluan tatasusunan laluan terpendek[].
    3. Pelaksanaan kod Java:
  4. Berikut ialah contoh kod untuk melaksanakan algoritma Dijkstra menggunakan bahasa Java:
  5. import java.util.*;
    
    public class Dijkstra {
        private static final int INF = Integer.MAX_VALUE;  // 定义无穷大
    
        public static void dijkstra(int[][] graph, int start) {
            int numVertices = graph[0].length;
    
            int[] dist = new int[numVertices];  // 存储最短路径的数组
            boolean[] visited = new boolean[numVertices]; // 记录顶点是否访问过
    
            for (int i = 0; i < numVertices; i++) {
                dist[i] = INF;  // 初始化距离数组为无穷大
                visited[i] = false; // 初始化访问数组为false
            }
    
            dist[start] = 0;  // 起点到自身的距离为0
    
            for (int count = 0; count < numVertices - 1; count++) {
                int u = getMinDistVertex(dist, visited);  // 选择当前最短路径的顶点
    
                visited[u] = true;  // 标记该顶点已访问
    
                for (int v = 0; v < numVertices; v++) {
                    if (!visited[v] && graph[u][v] != 0 && dist[u] + graph[u][v] < dist[v]) {
                        dist[v] = dist[u] + graph[u][v];  // 更新最短路径
                    }
                }
            }
    
            printSolution(dist);  // 打印最短路径
        }
    
        private static int getMinDistVertex(int[] dist, boolean[] visited) {
            int minDist = INF;
            int minDistVertex = -1;
    
            int numVertices = dist.length;
    
            for (int v = 0; v < numVertices; v++) {
                if (!visited[v] && dist[v] <= minDist) {
                    minDist = dist[v];
                    minDistVertex = v;
                }
            }
    
            return minDistVertex;
        }
    
        private static void printSolution(int[] dist) {
            int numVertices = dist.length;
    
            System.out.println("Vertex          Distance from Start");
    
            for (int i = 0; i < numVertices; i++) {
                System.out.println(i + "          " + dist[i]);
            }
        }
    
        public static void main(String[] args) {
            int[][] graph = {
                    {0, 4, 0, 0, 0, 0, 0, 8, 0},
                    {4, 0, 8, 0, 0, 0, 0, 11, 0},
                    {0, 8, 0, 7, 0, 4, 0, 0, 2},
                    {0, 0, 7, 0, 9, 14, 0, 0, 0},
                    {0, 0, 0, 9, 0, 10, 0, 0, 0},
                    {0, 0, 4, 0, 10, 0, 2, 0, 0},
                    {0, 0, 0, 14, 0, 2, 0, 1, 6},
                    {8, 11, 0, 0, 0, 0, 1, 0, 7},
                    {0, 0, 2, 0, 0, 0, 6, 7, 0}
            };
    
            dijkstra(graph, 0);
        }
    }
  6. 4. Analisis algoritma:
Kerumitan masa bagi algoritma Dijkstra ialah O(V^2), di mana V ialah bilangan bucu graf. Dalam kes di mana graf lebih besar atau mempunyai bilangan tepi yang lebih besar, kecekapan algoritma mungkin lebih rendah. Untuk meningkatkan kecekapan, struktur data seperti baris gilir keutamaan boleh digunakan untuk mengoptimumkan algoritma Dijkstra.

Kesimpulan:

Artikel ini memperkenalkan cara menggunakan bahasa Java untuk melaksanakan algoritma Dijkstra untuk menyelesaikan masalah laluan terpendek bagi graf. Algoritma ini boleh mencari laluan terpendek dari titik permulaan ke bucu lain dalam graf terarah atau tidak terarah, dan mencapai penyelesaian yang cekap dengan mengemas kini tatasusunan laluan terpendek. Pembaca boleh meneroka dan memperoleh pemahaman yang lebih mendalam tentang algoritma laluan terpendek untuk graf berdasarkan kod sampel dalam artikel ini.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma laluan terpendek graf menggunakan java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn