ios笔试题算法_微软笔试题-Dijkstra算法
生活随笔
收集整理的這篇文章主要介紹了
ios笔试题算法_微软笔试题-Dijkstra算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表的方式,這里均采用永久和臨時標號的方式。注意該算法要求圖中不存在負權邊。 用Dijkstra算法求解無向圖的最短路徑 - 潘建鋒 | Mind Seeker?taohuawu.club
微軟編程比賽里面的一道難度系數5%的編程題目如下:
Dijkstra算法是用來求解圖中頂點到另外其他頂點的最短路徑的,根據題目,我們可以把每兩個島嶼往來所花的最少金幣當成圖中的邊權值,由此可以用Dijkstra算法來解決這個問題。
根據圖來建立權值矩陣:
int[][] W = { { 0, 1, 5, -1, -1, -1,-1,-1 ,-1}, { 1, 0, 3, 7, 5, -1,-1,-1,-1}, { 5, 3, 0, -1, 1, 7, -1,-1,-1,-1 }, { -1, 7, -1, 0, 2, -1,3,-1,-1 }, { -1, 5, 1, 2, 0, 3, 6, 9,-1}, {-1,-1,-1, 3,6,-1, 0, 2, 7} {-1,-1,-1,-1,9,5,2, 0, 4} {-1,-1,-1,-1,-1,-1, 7, 4, 0} }; // (-1表示兩邊不相鄰,權值無限大)最終實現如下(java):
package wxt;import java.util.ArrayList; import java.util.List; import java.util.Scanner;//這個算法用來解決無向圖中任意兩點的最短路徑 public class Dijkstra {public static int dijkstra(int[][] W1, int start, int end) { boolean[] isLabel = new boolean[W1[0].length];// 是否標號 int[] indexs = new int[W1[0].length];// 所有標號的點的下標集合,以標號的先后順序進行存儲,實際上是一個以數組表示的棧 int i_count = -1;//棧的頂點 int[] distance = W1[start].clone();// v0到各點的最短距離的初始值 int index = start;// 從初始點開始int presentShortest = 0;//當前臨時最短距離 indexs[++i_count] = index;// 把已經標號的下標存入下標集中 isLabel[index] = true; while (i_count<W1[0].length) { // 第一步:標號v0,即w[0][0]找到距離v0最近的點 int min = Integer.MAX_VALUE; for (int i = 0; i < distance.length; i++) { if (!isLabel[i] && distance[i] != -1 && i != index) { // 如果到這個點有邊,并且沒有被標號 if (distance[i] < min) { min = distance[i]; index = i;// 把下標改為當前下標 } } } if (index == end) {//已經找到當前點了,就結束程序 break; } isLabel[index] = true;//對點進行標號 indexs[++i_count] = index;// 把已經標號的下標存入下標集中 if (W1[indexs[i_count - 1]][index] == -1 || presentShortest + W1[indexs[i_count - 1]][index] > distance[index]) { // 如果兩個點沒有直接相連,或者兩個點的路徑大于最短路徑 presentShortest = distance[index]; } else { presentShortest += W1[indexs[i_count - 1]][index]; } // 第二步:將distance中的距離加入vi for (int i = 0; i < distance.length; i++) { // 如果vi到那個點有邊,則v0到后面點的距離加 if (distance[i] == -1 && W1[index][i] != -1) {// 如果以前不可達,則現在可達了 distance[i] = presentShortest + W1[index][i]; } else if (W1[index][i] != -1 && presentShortest + W1[index][i] < distance[i]) { // 如果以前可達,但現在的路徑比以前更短,則更換成更短的路徑 distance[i] = presentShortest + W1[index][i]; } } } //如果全部點都遍歷完,則distance中存儲的是開始點到各個點的最短路徑 return distance[end] - distance[start]; } private static class Island{public int x,y;}public static void main(String[] args) { ArrayList<Island> arr=new ArrayList<Island>();// 建立一個權值矩陣 int [][] Test={{0,1,4},{1,0,1},{4,1,0}};Scanner input=new Scanner(System.in);int num=input.nextInt();for (int i = 0; i < num; i++) {Island island=new Island();island.x=input.nextInt();island.y=input.nextInt();arr.add(island);}int [][] t=new int[num][num];for (int i = 0; i < t.length; i++) {for (int j = 0; j < t.length; j++) {t[i][j]=Math.min(Math.abs(arr.get(i).x-arr.get(j).x), Math.abs(arr.get(i).y-arr.get(j).y));}}System.out.println(dijkstra(t, 0,num-1)); } }我是潘少,人生這么長,做個有趣的人,寫點有趣的文字。此文章首發于我的個人公眾號 - 潘建鋒,歡迎關注,代碼、故事、靈魂,那里都有。
關于我?mp.weixin.qq.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ios笔试题算法_微软笔试题-Dijkstra算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql和oracle的通用存储,My
- 下一篇: java下载文件夹_java如何通过共享