Java基于Dijkstra算法實現(xiàn)校園導游程序
本文實例為大家分享了Dijkstra算法實現(xiàn)校園導游程序的具體代碼,供大家參考,具體內(nèi)容如下
應用設計性實驗
1.問題描述
校網(wǎng)導游程序: 一個校園有若干景點,如正校門、人工湖、磁懸浮列車實驗室、櫻花大道、圖書館、體育場體育館和禮堂等。實現(xiàn)一個為來訪客 人提供信息在詢服務的程序,如查詢景點的詳細信息,查詢兩個景點之間的一條最短路徑。
2.實驗要求
(1)設計你所在學校的校園平面圖,所含景點不少于10個。
(2)來訪客人可以輸人任一個景點的名稱,查詢景點的詳細信息。
(3)來訪客人可以輸人任何兩個景點的名稱,查詢這兩個景點之間的一條最短路徑。
3.實現(xiàn)提示
以圖中的頂點表示校園內(nèi)各景點,存放景點代號、名稱和簡介等信息;以邊表示路徑,存放路徑長度等相關信息,如實驗圖10.2所示。本題可采用鄰接方陣或鄰接表實現(xiàn)圖的存儲結(jié)構(gòu),利用迪杰斯特拉算法求得最短路徑。
該程序“見錯就收”、“見好就收”效率比較高——“剪枝”。
import java.util.ArrayList; import java.util.Scanner; ? public class TourGuide { ? ? private static final Site[] sites = new Site[14];//以地點代號循序存放地點 ? ? private static final ArrayList<String> arrSites = new ArrayList<>(); ? ? private static final double[][] matrix = new double[14][14];//用來存放地點間的路徑長度(對角線為0,不存在為INFINITY) ? ? ? static { ? ? ? ? sites[0] = new Site(0, "正校門", "正校門...");//初始化存放地點的數(shù)組 ? ? ? ? sites[1] = new Site(1, "東校門", "東校門..."); ? ? ? ? sites[2] = new Site(2, "西校門", "西校門..."); ? ? ? ? sites[3] = new Site(3, "北校門", "北校門..."); ? ? ? ? sites[4] = new Site(4, "食堂", "食堂..."); ? ? ? ? sites[5] = new Site(5, "磁懸浮列車實驗室", "磁懸浮列車實驗室..."); ? ? ? ? sites[6] = new Site(6, "櫻花大道", "櫻花大道..."); ? ? ? ? sites[7] = new Site(7, "圖書館", "圖書館..."); ? ? ? ? sites[8] = new Site(8, "體育場", "體育場..."); ? ? ? ? sites[9] = new Site(9, "體育館", "體育館..."); ? ? ? ? sites[10] = new Site(10, "游泳館", "游泳館..."); ? ? ? ? sites[11] = new Site(6, "禮堂", "禮堂..."); ? ? ? ? sites[12] = new Site(6, "教學樓", "教學樓..."); ? ? ? ? sites[13] = new Site(6, "宿舍", "宿舍..."); ? ? ? ? matrix[0][4] = 35;//初始化地點間的路徑長度 ? ? ? ? matrix[0][11] = 5; ? ? ? ? matrix[1][10] = 75; ? ? ? ? matrix[1][13] = 10; ? ? ? ? matrix[2][4] = 30; ? ? ? ? matrix[2][7] = 5; ? ? ? ? matrix[3][6] = 15; ? ? ? ? matrix[3][7] = 50; ? ? ? ? matrix[3][9] = 15; ? ? ? ? matrix[3][10] = 20; ? ? ? ? matrix[4][8] = 60; ? ? ? ? matrix[4][11] = 40; ? ? ? ? matrix[5][8] = 45; ? ? ? ? matrix[5][11] = 10; ? ? ? ? matrix[8][11] = 50; ? ? ? ? matrix[9][10] = 20; ? ? ? ? matrix[9][13] = 100; ? ? ? ? matrix[11][12] = 25; ? ? ? ? matrix[12][13] = 20; ? ? ? ? ? for (Site site : sites) arrSites.add(site.getName()); //初始化ArrayList,用于以字符串的形式按順序存放地點的名字 ? ? ? ? ? for (int i = 0; i < sites.length; i++) {//初始化地點間的路徑長度 ? ? ? ? ? ? for (int j = 0; j < sites.length; j++) { ? ? ? ? ? ? ? ? if (i != j && matrix[i][j] == 0) ? ? ? ? ? ? ? ? ? ? matrix[i][j] = Double.POSITIVE_INFINITY; ? ? ? ? ? ? ? ? if (i > j) ? ? ? ? ? ? ? ? ? ? matrix[i][j] = matrix[j][i]; ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? ? public static void main(String[] args) { ? ? ? ? Scanner scanner = new Scanner(System.in); ? ? ? ? int select; ? ? ? ? while (true) { ? ? ? ? ? ? System.out.println("請輸入您想了解的信息:\n1.查詢地點詳細信息\n2.查詢地點間的最短路徑\n3.退出系統(tǒng)"); ? ? ? ? ? ? select = scanner.nextInt(); ? ? ? ? ? ? switch (select) { ? ? ? ? ? ? ? ? case 1: ? ? ? ? ? ? ? ? ? ? System.out.print("輸入查詢地點的名稱: "); ? ? ? ? ? ? ? ? ? ? String siteIntro = query(scanner.next()); ? ? ? ? ? ? ? ? ? ? if (siteIntro != null) {//其實這里也可以直接arrSites.indexOf(name)判斷 ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(siteIntro); ? ? ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? ? ? System.err.println("輸入的地點名稱不存在!"); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case 2: ? ? ? ? ? ? ? ? ? ? System.out.print("輸入所要查詢最短路徑的兩地的名稱(例如:正校門-禮堂): "); ? ? ? ? ? ? ? ? ? ? String path = findShortestPath(scanner.next()); ? ? ? ? ? ? ? ? ? ? if (path != null) { ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(path); ? ? ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? ? ? System.err.println("輸入的所要查詢最短路徑的兩地的名稱或者格式有誤!"); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case 3: ? ? ? ? ? ? ? ? ? ? System.exit(0); ? ? ? ? ? ? ? ? default: ? ? ? ? ? ? ? ? ? ? System.err.println("輸入的選項有誤!"); ? ? ? ? ? ? } ? ? ? ? ? ? System.out.println(); ? ? ? ? } ? ? } ? ? ? public static String query(String siteName) { ? ? ? ? int index = arrSites.indexOf(siteName); ? ? ? ? if (index == -1) { ? ? ? ? ? ? return null; ? ? ? ? } else { ? ? ? ? ? ? return sites[index].getIntro(); ? ? ? ? } ? ? } ? ? ? public static String findShortestPath(String path) { ? ? ? ? int indexOfSeparator = path.indexOf('-'); ? ? ? ? if (indexOfSeparator == -1) return null; ? ? ? ? String start = path.substring(0, indexOfSeparator); ? ? ? ? String end = path.substring(indexOfSeparator + 1); ? ? ? ? int indexOfStart = arrSites.indexOf(start); ? ? ? ? int indexOfEnd = arrSites.indexOf(end); ? ? ? ? if (indexOfStart == -1 || indexOfEnd == -1) return null; ? ? ? ? return dijkstra(indexOfStart, indexOfEnd); ? ? } ? ? ? private static String dijkstra(int start, int end) { ? ? ? ? int vertexCount = TourGuide.matrix.length; ? ? ? ? boolean[] isInUSet = new boolean[vertexCount];//數(shù)組元素默認初始化為false ? ? ? ? double[] distant = new double[vertexCount]; ? ? ? ? int[] parent = new int[vertexCount]; ? ? ? ? for (int i = 0; i < vertexCount; i++) { ? ? ? ? ? ? distant[i] = TourGuide.matrix[start][i]; ? ? ? ? ? ? parent[i] = start; ? ? ? ? } ? ? ? ? isInUSet[start] = true; ? ? ? ? distant[start] = 0; ? ? ? ? parent[start] = -1; ? ? ? ? ? for (int i = 0; i < vertexCount; i++) { ? ? ? ? ? ? double minCost = Double.POSITIVE_INFINITY; ? ? ? ? ? ? int minIndex = start; ? ? ? ? ? ? for (int j = 0; j < vertexCount; j++) { ? ? ? ? ? ? ? ? if (!isInUSet[j]) ? ? ? ? ? ? ? ? ? ? if (distant[j] < minCost) { ? ? ? ? ? ? ? ? ? ? ? ? minCost = distant[j]; ? ? ? ? ? ? ? ? ? ? ? ? minIndex = j; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? if (minCost < Double.POSITIVE_INFINITY) { ? ? ? ? ? ? ? ? isInUSet[minIndex] = true; ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? break; ? ? ?//處理的圖為非連通圖,即不輸出相應路徑(不存在能達到該頂點的路徑) ? ? ? ? ? ? } ? ? ? ? ? ? if (minIndex == end)//找到后直接return提高效率 ? ? ? ? ? ? ? ? return printDijkstra(parent, distant, start, end); ? ? ? ? ? ? for (int j = 0; j < vertexCount; j++) {//迭代優(yōu)化 ? ? ? ? ? ? ? ? if (!isInUSet[j] && distant[minIndex] + TourGuide.matrix[minIndex][j] < distant[j]) { ? ? ? ? ? ? ? ? ? ? distant[j] = distant[minIndex] + TourGuide.matrix[minIndex][j]; ? ? ? ? ? ? ? ? ? ? parent[j] = minIndex; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return null; ? ? } ? ? ? private static String printDijkstra(int[] parent, double[] distant, int start, int end) { ? ? ? ? int p = parent[end]; ? ? ? ? StringBuilder path = new StringBuilder(arrSites.get(end)); ? ? ? ? while (p != -1) { ? ? ? ? ? ? path.insert(0, arrSites.get(p) + "->"); ? ? ? ? ? ? p = parent[p]; ? ? ? ? } ? ? ? ? return arrSites.get(start) + "->" + arrSites.get(end) + " [" + path + "]: " + distant[end]; ? ? } } ? class Site { ? ? private int code; ? ? private String name; ? ? private String intro; ? ? ? public Site(int code, String name, String intro) { ? ? ? ? this.code = code; ? ? ? ? this.name = name; ? ? ? ? this.intro = intro; ? ? } ? ? ? public int getCode() { ? ? ? ? return code; ? ? } ? ? ? public void setCode(int code) { ? ? ? ? this.code = code; ? ? } ? ? ? public String getName() { ? ? ? ? return name; ? ? } ? ? ? public void setName(String name) { ? ? ? ? this.name = name; ? ? } ? ? ? public String getIntro() { ? ? ? ? return intro; ? ? } ? ? ? public void setIntro(String intro) { ? ? ? ? this.intro = intro; ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Java畢業(yè)設計實戰(zhàn)之校園一卡通系統(tǒng)的實現(xiàn)
- Java實戰(zhàn)項目之校園跑腿管理系統(tǒng)的實現(xiàn)
- Java?實戰(zhàn)范例之校園二手市場系統(tǒng)的實現(xiàn)
- Java 實戰(zhàn)練手項目之校園超市管理系統(tǒng)的實現(xiàn)流程
- Java 實戰(zhàn)項目錘煉之校園宿舍管理系統(tǒng)的實現(xiàn)流程
- Java實現(xiàn)的具有GUI的校園導航系統(tǒng)的完整代碼
- JavaWeb開發(fā)基于ssm的校園服務系統(tǒng)(實例詳解)
- Java模擬HTTP Get Post請求 輕松實現(xiàn)校園BBS自動回帖
相關文章
SpringCloud的@RefreshScope 注解你了解嗎
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-09-09Java中的SynchronousQueue阻塞隊列及使用場景解析
這篇文章主要介紹了Java中的SynchronousQueue阻塞隊列及使用場景解析,SynchronousQueue 是 Java 中的一個特殊的阻塞隊列,它的主要特點是它的容量為0,這意味著 SynchronousQueue不會存儲任何元素,需要的朋友可以參考下2023-12-12Java 自定義Spring框架與Spring IoC相關接口分析
Spring框架是由于軟件開發(fā)的復雜性而創(chuàng)建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發(fā)2021-10-10springboot掃描引入jar包的service等組件方式
這篇文章主要介紹了springboot掃描引入jar包的service等組件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot集成Redis—使用RedisRepositories詳解
這篇文章主要介紹了SpringBoot集成Redis—使用RedisRepositories詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03