幾大最短路徑演算法簡述

2021-09-10 13:52:37 字數 2704 閱讀 2006

floyd-warshall演算法過程簡述:時間複雜度o(n^3)

若a點到b點直接舉例不為最短距離,則他們之間必有中間點,首先假設點k為中間點,若a->k+k->b小於a->b則將a->b更新為

a->k+k->b,遍歷所有兩點間的組合;

以(k+i)(12=2;2->3=5;3->1=-6;每迴圈一遍這個環,最短路徑就減1.

#include #include #define infinity 99999999

int main()

} for(i=1;i<=m;i++)

//floyd-warshall核心演算法

for(k=1;k<=n;k++)

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

if(e[i][k]e[i][k]+e[k][j])

e[i][j]=e[i][k]+e[k][j];

for(i=1;i<=n;i++)

} return 0;

}

djistra演算法簡述:時間複雜度o(n^2)

djistra演算法求得是源點到各頂點間的最短路徑,與floyd演算法不同(求的是各點之間的最短路徑),但是後者優良的可擴充套件性使得它的應用更為廣泛。每次迴圈確定一條最短的邊,並更新這個頂點的出邊相連的頂點到源點的距離。

#include #define inf 99999999

int main()

for(i=1;i<=n;i++)

dis[i]=e[1][i];

//book陣列初始化

for(i=1;i<=n;i++)

book[i]=0;

book[1]=1;

//dijkstra演算法核心語句

for(i=1;i<=n;i++)

} } for(i=1;i<=n;i++)

printf("1->%d:%d\n",i,dis[i]);

getchar();

return 0;

}

bellman-ford演算法簡述:

此演算法的時間複雜度為o(mn),比djistra的複雜度高,但這是最差的情況,實際上在迴圈中可以判斷是否到達了dis陣列中儲存的都是最短路徑的地步,

可以提前退出(圖中無負權迴路),若有負權迴路,就會執行到k=n-1,不過迪傑斯特拉也解決不了帶負權邊的圖。

#include #define inf 99999999

int main()

} if(check==0)break;//陣列沒有更新,提前退出迴圈

} //檢測有無負權迴路

flag=0;

for(i=1;i<=m;i++)

if(flag==1)printf("此圖含有負權迴路\n");

else

getchar();

return 0;

}

鄰接表在稀疏圖的時候比鄰接矩陣的使用時間複雜度更小,前者為o(),後者為o();

以下演算法是鄰接表的遍歷應用

演算法思想簡述:

此演算法總體思想類似於鍊錶,但是每次插入資料是在「表頭」而非「表尾」,first陣列的下標表示幾號頂點,存的資料表示在陣列u,v,w,的第幾個資料,同時(由於使用的是

next【i】)所以也同時指向了next的第i個資料;當同樣的起點路線再次出現時,next【i】存入原本在first中的資料,first存入新資料;以此類推,完成類似於鍊錶的操作,

為遍歷相同起點路線提供了便利。

如果圖為乙個稀疏圖的話,用接鄰錶比用接鄰矩陣儲存要更好,前者時間複雜度為o(m+n)log(n),後則為o(n^2)。

#include #define inf 99999999

int main()

//遍歷

for(i=1;i<=n;i++)

} getchar();

return 0;

}

演算法思想簡述:

由bellman-ford演算法的過程可以看出,每次鬆弛其實只與上次鬆馳過的頂點相連的邊有關,所以沒有必要遍歷所有頂點查詢可以鬆弛的邊,使用佇列將鬆弛過的頂點入隊,

查詢與頂點相連的可鬆弛的邊,每個頂點只能入隊一次 (有點像廣搜啊,按照乙個源點拓展,有序地遍歷所有頂點)。

#include #include #define inf 99999999

int main(),i,j,k,n,m,u[10],v[10],w[10],first[10],next[10],check,flag;

scanf("%d%d",&n,&m);

memset(first,-1,sizeof(int)*10);

for(i=1;i<=m;i++)

for(i=1;i<=n;i++)

dis[i]=inf;

dis[1]=0;

int head=1,tail=1,que[101]=;//建立佇列

que[head]=1;tail++;//源點入隊

while(headdis[u[k]]+w[k])

}k=next[k];

} book[que[head]]=0;

head++;//出隊

} for(i=1;i<=n;i++)

getchar();

return 0;

}

幾大最短路徑演算法比較

july 二零一一年二月十二日。幾個最短路徑演算法的比較 floyd 求多源 無負權邊的最短路。用矩陣記錄圖。時效性較差,時間複雜度o v 3 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短...

幾大最短路徑演算法比較

用於解決最短路徑問題的演算法被稱做 最短路徑演算法 有時被簡稱作 路徑演算法 最常用的路徑演算法有 dijkstra演算法 a 演算法 spfa演算法 bellman ford演算法和floyd warshall演算法,本文主要介紹其中的三種。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...