floyd演算法
演算法解析:因為一張連通圖中不是所有點到其他點都是有一條直接路徑的,所以我們可以借助別的和終點相連的點到達終點,便是起點-中轉....-終點;
以小推大,
小:假設當前只有1可以當中轉點,start為起點,end為終點;因此當start點需要借助點1到end點時,便需要進行if(edge[start][end]>edge[start][1]+edge[1][end])的判斷,
這個判斷的意思就是 :我的起點到終點的路徑長度是否比中轉方法的長度長,這時我們當然需要優先選擇短的路徑,並且在edge[start][end]中更新,這樣就相當於我們就確定了一條start到end的最佳路徑。
大:理解了小例子後,我們就可以去推測圖上的其他所有點都可以作為某個start到某個end點的中轉點,因此通過不斷比較,不斷更新edge[start][end],我們最後就可以得到start點到end點的最短距離矩陣。
輸入:頂點數,邊數;有向圖;
輸入格式:起點 終點 路徑長度;
樣例:4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
偽**:
1 floyd(g)view code
原始碼
1 #include 2 #include 3 #include 4 #include 5 #includeview code6using
namespace
std;
7const
int maxen=200;8
const
int maxx=9999;9
intedge[maxen][maxen];
10void init(int n)18}
19}20void floyd(int n)27}
28}29}
30}31int
main()
40floyd(n);
41for(int i=1;i<=n;++i)
45 printf("\n"
);46}47
return0;
48 }
演算法時間複雜度:o(n³) 分析:演算法需要執行三個巢狀迴圈,所以需要n³
dijkstra演算法
介紹:用於計算乙個節點到其他節點的最短距離的演算法。
個人演算法分析 1:設兩個集合a和b,a中是訪問過被收納入集合的點,b是還未訪問過的點;
2:設乙個陣列visit,這個陣列記錄每個頂點是否被訪問過;
3:先將起點納入集合a,並且標記訪問為true;
4:找出離起點最短距離的邊,然後更新圖中每個點到起點距離。(就是以找到的這個點為中轉點,判斷其他點是否能夠通過這個點與起點距離拉近)
5:重複步驟4,直至所有點被訪問過;
時間複雜度:o(n²)
樣例
8 11
1 2 1
2 4 2
3 1 2
4 3 1
4 6 8
5 4 2
5 7 2
6 5 2
7 6 3
7 8 3
8 6 2
**:
1 #include 2 #include 3 #include 4 #include 5 #includeview code6using
namespace
std;
7const
int maxen=200;8
const
int maxx=9999;9
int edge[maxen][maxen];//
邊矩陣
10int visit[maxen];//
記錄被訪問過的點
11int lowcost[maxen];//
起到到每條邊的最短距離
12void init(int n)
17for(int i=1;i<=n;i++)24}
25}26void dijkstra(int start,int
n)35
}36 visit[index]=true; //
標記訪問
37for(int k=1;k<=n;k++)41}
42}43}
44int main(void
) 54
int start=1;//
起點為點1
55 lowcost[start]=0;//
起點到本身的距離為0
56 visit[start]=true; //
起點標記已訪問狀態
57dijkstra(start,n);
58 printf("
%d\n
",lowcost[8]);//
輸出點1到點8的距離
59return0;
60 }
github:
演算法分析與實踐 作業2 Floyd演算法
用floyd演算法求解下圖各個頂點的最短距離。最大容量 define vertextype int 頂點型別 define inf 65535 象徵無窮大 typedef struct graph 鄰接矩陣 int p num num 前驅表 int vexnum,arcnum vernum為頂點個...
PHP學習2 類和物件
類和物件 1.不可定義stdclass類 2.php中 打頭的被視為魔術函式,sleep 和 wakeup 在 php 類中是魔術函式,不能命名函式,建議不要在 php 中將函式名以 開頭。3.類的定義和使用類似與c 中的類,在成員引用類於其中的指標,外加 4.類的繼承只能是單繼承,順序繼承下去 5...
學習筆記(2) 棧和佇列
棧和佇列都是線性結構,是特殊的線性表。棧 僅在表尾進行插入或刪除元素的操作。表尾稱為棧頂,表頭稱為棧底。不含元素的空表為空棧。又稱為 先進後出 線性表。棧有兩種儲存結構 順序儲存和鏈式儲存 與線性表類似 設定top指標指向棧頂位置,base指標指向棧底位置,當top base 時,棧為空棧。使用c語...