1、圖及無向圖php
2、有向圖html
3、網絡java
4、經常使用的圖算法web
(1)廣度優先遍歷:算法
一、往隊列中添加9,而且把它標記爲已訪問;編程
二、從隊列中取出9;數組
三、往鏈表中添加9;網絡
四、從隊列中添加六、七、8,逐個標記爲已訪問;數據結構
五、從隊列中取出6;學習
六、往鏈表中添加6;
七、往隊列中添加三、4,逐個標記爲已訪問。
八、從隊列中取出7,並將它添加到鏈表中;
九、往隊列中添加5,而且把它標記爲已訪問;
十、從隊列中取出8,並將它添加到鏈表中(這時再也不往隊列中添加任何新的結點了,由於頂點8再也沒有還沒有訪問過的鄰居了)
十一、從隊列中取出3,並將它添加到鏈表中;
十二、往隊列中添加1,而且把它標記爲已訪問;
1三、從隊列中取出4,並加它添加到列表中;
1四、往隊列中添加2,而且把它標記爲已訪問;
1五、從隊列中取出5,並將它添加到列表中(因爲再沒有未訪問過的鄰居,所以不需再往隊列中添加頂點)
1六、從隊列中取出2,並將它添加到鏈表中;
1七、從隊列中取出2,並將它添加到列表中。
這樣列表就以廣度優先次序存放了從頂點9開始的以下頂點:九、六、七、八、三、四、五、1和2.
起始頂點 | 廣度優先遍歷 |
---|---|
A | A,B,C,D |
B | B,A,D,C |
C | C,B,A,D |
D | D,B,A,C |
起始頂點 | 廣度優先遍歷 |
---|---|
A | A,B,C |
B | B,A,C |
C | C,B,A |
D | D |
有向圖有時也稱爲雙向圖。
有向圖中的路徑並非雙向的。
就這兩句話,我產生了疑問,爲何有向圖不爲雙向,但叫作雙向圖,他所謂的雙向是同樣的嗎?
在第二張很顯然就是一個雙向的網絡,網絡一樣也是圖的一種,可是我很詳細的看了一下有向圖中的路徑並非雙向的。這句話出現的地方,這句話後買呢還接着一句話:除非咱們添加了額外的邊連通他們倆,也就是這句話介紹是就假如A指向了B,可是在前提中就沒有讓B指向A,當咱們有指向返回的那條邊的時候才能夠有雙向,因此我以爲書本在這裏寫的會誤導第一次學習有向圖的同窗。
Weight[getIndex((T) vertex1)][getIndex((T) vertex2)]=weight;
,用於對於權重添加到一個二位數組中,同時在無向圖中是有與它對稱的語句Weight[getIndex((T) vertex2)][getIndex((T) vertex1)]=weight;
,這樣就講連起來的線給賦予一個權重。T
,而後用一個result
記錄下來,進行重複的找而後找到一條路走到盡頭,將結果存進一個數組中,重複過程。個人初版代碼以下Double[] temp = new Double[100]; Double result=0.0; int a =0; int b =0; int c=0; for (int i =0;i<end+1;i++){ start=c; result=0.0; for (int j =b;j<end;j++) { result=0.0; start=a; for(int r=b;r<end;r++){ result += Weight[start][r + 1]; start=r+1; } temp[a]=result; a++; b=b+2; } a++; b++; } //我經過一直講這個二維數組的位置進行查找在相加再保存
Double min = temp[0]; for (int r =0;r<end;r++){ if (temp[r+1]<min&&temp[r+1]>0){ min=temp[r+1]; } } return min;
五、爲何我會斃掉初版,由於存在着很大的問題,首先,假如我插入的元素夠多,個人循環不夠多,(我想過用遞歸實現,可是由於涉及二維數組的橫向判斷,因此我以爲遞歸也不行),而後就是由於涉及到橫向的判斷,舉個例子,假如A和B連了,B和C連了,B和D也連了,這個時候咱們就多了一路,由於二維數組移動的位置太不可控,因此位置的增長減小就存在很大的問題,因此就陷入了一直想用連續循環的這個弊病中,一時半會兒一直解決不了這個問題,就想着能不能用咱們pp15.1須要實現的方式,也就是用鏈表的方式。
六、(1)首先咱們先構建這樣的一個圖:
(2)而後咱們須要構建相似鏈地址法繪製出一個以下圖的圖:
(3)個人新的一版思路是:當咱們在保存頭結點的數組中找到開始的結點,而後再須要寫循環進行對因而否鏈接進行判斷,在進行將權重相加,可是我依舊又是斃了這一版,由於在偶爾的一天晚上凌晨,翻到了算法導論圖論的這一部分,看到了裏面講解的有一部分叫作單源最短路徑,發現這一部分和這個題目存在着很大的關聯,就仔細的看了看,有一個算法就是針對此類題型設計的,叫作Dijkstra算法,我很感謝我當時買了這本書,讓我從痛苦中走了出來。
(4)Dijkstra算法:
(1)第一個選擇的頂點是v1,路徑長是爲0;該頂點標記爲known。既然v1是known的,那麼某些表項就須要調整。鄰接到v1的頂點是v2和v4。這兩個項獲得調整。
(2)下一步,選取v4而且標記爲known。頂點v3,v5,v6,v7是鄰接的頂點,而它們實際上都須要調整。如圖
(3)接下來選擇v2,v4是鄰接的點,但已是known的了,所以對它沒有工做要作。v5是鄰接的點但不作調整,由於通過v2的值2+10=12而長爲3的路徑已是已知的。圖
(4)下一個被選擇的頂點是v5,其值爲3。v7是惟一的鄰接頂點,可是它不用調整,由於3+6>5.而後選取v5,對v6的距離下調到3+5=8。如圖:
(5)再下一個選取的頂點是v7,v6下調到5+1=6,如圖:
(6)最後,咱們選取的頂點是v6。最後的表在下圖中顯示,在以下的圖形顯示算法期間是如何標記爲known的以及頂點是如何更新的。
本週無測試。
代碼調試中的問題和解決過程, 一個問題加1分
第一次要好好寫寫感悟了:
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 6/6 |
第二週 | 1313/1313 | 1/2 | 20/26 |
第三週 | 901/2214 | 1/3 | 20/46 |
第四周 | 3635/5849 | 2/4 | 20/66 |
第五週 | 1525/7374 | 1/5 | 20/86 |
第六週 | 1542/8869 | 2/5 | 25/111 |
第七週 | 1391/10260 | 1/6 | 20/131 |
第八週 | 4379/14639 | 2/8 | 25/156 |
第九周 | 3155/17794 | 1/9 | 30/186 |
藍墨雲班課
Java程序設計
算法導論:別點了,是本書
數據結構與算法分析:別點了,是本書
Dijkstra 最短路徑算法 秒懂詳解