最短路徑演算法
1、dijkstra演算法
目的是求解固定起點分別到其餘各點的最短路徑
步驟如下:
準備工作:構建二位矩陣edge,edge[i][j]儲存i->j的權重,如果i==j則edge[i][j]=0,如果i和j不是直達的,則edge[i][j]=max_int
構建陣列dis,其中dis[i]表示其實點start->i之間的權重,不斷更新,得到最小的權重
選取離start最近的直達點,(注,非直達的點一定會經過中間的跳變點,間接到達,首先考慮的一定是經過離start最近的點進行跳變)
判斷dis[i]與dis[離start最近的點index]+edge[離start最近的點index][i]的大小,更新dis[i]
重複3-4(注意標記,防止重複計算)
#include usingnamespace
std;
const
int max_int = ~(1
<<31
);const
int min_int = (1
<<31
);int
main()
//input the edge data
cout<<"
please input the edge data: t1(start node), t2(end node), t3(weight)
"
/** init the is_visited with 0
* init the dis
*/for(int i=1; i<=n; i++)
is_visited[s] = 1
;
//the dijkstra algorithm
for(int i=1; i<=n; i++)
}is_visited[u] = 1
;
for(int k=1; k<=n; k++)}}
}//print the result
for(int i=1; i<=n; i++)
}
2、floyd演算法
目的是求解任意兩點的最短路徑,核心思想是經過任意數量的節點進行中轉,檢查路徑是否為最短
for(k=1;k<=n;k++)//經過k進行中轉for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
最短路徑演算法實現
什麼是最短路徑呢?考慮到帶權路徑圖,我們把一條路徑上經過的權值之和是該路徑的路徑長度或者是帶權路徑長度。那麼我來個案例,比如我們還是村莊之間修路,我們指定了乙個村莊起點和終點,假如我們修路只能在由村莊之間修路的全部可能情況之中選擇一種,也就是說我們想從我們指定的村莊開始修路,修到我們指定的目的地,我...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...
Dijkstra最短路徑演算法實現
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 輸出乙個整數,表示1號點到n...