最短路的四種的求解方法 模板

2021-08-21 19:56:59 字數 2773 閱讀 2246

floyd演算法只有五行**,**簡單,三個for迴圈就可以解決問題,所以它的時間複雜度為o(n*n*n),可以求多源最短路問題。

floyd演算法可以處理帶有負權邊,但不能處理帶有「負權迴路」的圖。

核心**:

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

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

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

這段**的思想就是:最開始只允許經過1號頂點進行中轉,接下來只允許經過1號和2號頂點進行中轉......允許經過1~n號所有頂點進行中轉,求任意兩點之間的最短路程。用一句話概括就是:從i號頂點到j號頂點只經過前k號點的最短路程。

完整**:

#include#include#define inf 99999999

int main()

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

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

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

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

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

printf("\n");

} return 0;

}

dijkstra演算法-單源最短路,以乙個頂點出發到所有點的最短路。

複雜度n*n

演算法基本思想:

每次找到離源點最近的頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑。

我對這個演算法的理解就是依次找到離源點最近的頂點跟每個點到源點的距離,然後每個點到源點的距離與離源點最近的頂點 加上兩頂點的距離 分別比較。就是dis[v]=dis[u]+e[u][v]。

完整**:

#include#include#define inf 99999999

int main()

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

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

dis[i]=map[1][i];

book[1]=1;

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

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

printf("%d ",dis[i]);

return 0;

}

dijkstra演算法雖好,但是它不能解決帶有負權邊的圖。

演算法基本思想:

bellman-ford演算法最多有n-1個階段。在每乙個階段,我們對每一條邊都要執行鬆弛操作。其實每實施一次鬆弛操作,就會有一些頂點已經求得其最短路,即這些頂點的最短路的「估計值」變為「確定值」。此後這些頂點的最短路的值就會一直保持不變,不再受鬆弛操作的影響。

時間複雜度是(n*m)

適用條件&範圍:

單源最短路徑;

有向圖&無向圖;

邊權可正可負(如有負權迴路輸出錯誤提示);

核心**:

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

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

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

完整**:

#include#define inf 99999999

int main()

}if(check==0)

break;

} //檢驗負權迴路

flag=0;

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

if(flag)

printf("此圖含有負權迴路\n");

else

return 0;

}

spfa其實就是使用佇列優化的bellman-ford演算法。

spfa演算法在形式上和廣度優先搜尋非常類似,不同的是在廣度優先搜尋的時候乙個頂點出隊後通常就不會再重新進入佇列。而這裡乙個頂點很可能再出佇列之後再次被放入佇列,也就是當乙個頂點的最短路程估計值變小之後,需要對其所有邊進行鬆弛,但是如果這個頂點的最短路程估計值再次變小,仍需要對其所有邊再次進行鬆弛,這樣才能保證相鄰頂點的最短路程估計值同時更新。

演算法基本思想:

初始時將源點加入佇列,每次隊首(head)取出乙個頂點,並對與其相鄰的所有頂點進行鬆弛嘗試,若某個點鬆弛成功,且這個相鄰的頂點不在佇列中,則將他加入到佇列中,對當前頂點處理完畢後立即出隊,並對下乙個新隊首進行如上操作,直到隊列為空時演算法結束。這裡用乙個book陣列來記錄每個頂點是否在佇列中。

完整**:

#include#define inf 99999999

int main()

; int n,m,i,j,k,head=1,tail=1;

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

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

dis[i]=inf;

dis[1]=0;

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

book[i]=0;

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

first[i]=-1;

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

//1號頂點入隊

que[tail]=1;

tail++;

book[1]=1;

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

}k=next[k];

} book[que[head]]=0;

head++;

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

printf("%d ",dis[i]);

return 0;

}

最短路四種演算法模板

1.floyed演算法求多源最短路 includeusing namespace std const int maxn 1e3 10 define inf 0x3f3f3f3f int mp maxn maxn 記錄圖之間的路徑 int main 初始化 for int i 0 i a b c mp...

最短路徑四種解法

在學習 圖 的時候,遇到過一道經典的題 最短路徑。最短路徑有四種最經典的解法。廢話不多說,直接上 floyd warshall include using namespace std const int m 999999 int n,m,p1,p2,l int map 1000 1000 intma...

四種最短路徑演算法對比

floyd dijkstra bellman ford 佇列優化的bellman ford 空間複雜度 o n o m o m o m 時間複雜度 o n o m n logn o nm o nm 適用情況 稠密圖,和頂點關係密切 稠密圖,和頂點關係密切 稀疏圖,和邊關係密切 稀疏圖,和邊關係密切 ...