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...