與最小生成樹學習相比,一開始我有點昏了。感覺既然都能計算出 「最短」 路徑,為什麼還要專門的研究最短路徑的dijkstra,floyd呢?
後來才知道,最小生成樹是保證這個圖的所有路徑加起來最短!
而最短路徑保證a點到b的路徑最短,並不能保證這個圖的路徑最短!
dijkstra:
狄克斯特拉演算法,這個演算法,我到現在都感覺跟prim演算法有一些相同之處。
他們都是一開始按照起始點,儲存起始點所能達到的點的距離。
然後從中找出乙個最近的點k,然後再根據點k所能到達的a點的距離更新原先起始點所能到達的a點的距離,前提起始點到k點再到a點的距離小於起始點直接到達a點的距離
我想著兩個演算法有兩個區別 :1、prim是只要已經連通的點中,假設k點,k點到a點的距離小於原先已更新的到達a點的最短距離,那就更新lowcost
kruscal則是,k點到a點的距離小於起始點到達a點的距離,則更新
2、prim對於已經確定加入s集合的點,根據之後所能到達的點跟已經加入s點的距離相比,如果比之前的最短距離還小,還會重新將其從s集合中拿出(即重新規劃路線)
kruscal則是已經確定加入s集合的點,就不會再將其從s集合中拿出來了
原因是:prim查詢的最近距離k點,是已經加入s集合中某個點距離k點距離最短即可
kruscal則是距離起始點最近的點,才能作為k點,所以之後找到的肯定都是大於之前的距離的,亦或是原先起始點到達不了的點,想要到達這個點必須經過之前的點,所以距離怎麼都不會比之前的短。
public class dijkstra
s[v] = 1;//v已經放入集合s中
path[v] = 0;//且上乙個點不存在
for(int i = 1 ; i < g.n ; i ++)
}s[k] = 1;
for(int j = 0 ; j < g.n ; j ++)}}
}dispath(s,dist,path,v,g.n);//輸出路徑
}private void dispath(int s,int dist,int path,int v,int n)}}
private void ppath(int path, int i,int v)
}
floyd:
弗洛伊德演算法:這個演算法第一次接觸還是大一參加acm的時候,那個時候蠻喜歡的,因為簡單易記!三重迴圈就好了!
原理:對於每兩個點,都遍歷所有的點作為中間點搭橋,判斷出最短的距離,其他的點亦可以在這個這兩個點的基礎上判斷出最短距離
public class floyd
}for(int k = 0 ; k < g.n ; k ++)}}
}dispath(a,path,g.n);
}private void dispath(int a, int path, int n)
}else}}
}private void ppath(int path, int i, int j)
}
Codeup最短路徑 最短路徑
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...
最短路徑之最短路徑問題
提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...