求各點間最短路演算法(樹形)

2021-06-22 02:11:41 字數 956 閱讀 4130

由於floyd演算法為o(n^3)演算法,肯定會超時,而spfa和dijistala求的是從源點到其他點的最短路徑與任意兩點間最短路無關,如果做n編上述演算法必然超時,所以應該尋求更快的演算法。

建議不會lca的同學先學學習一下,這是乙個非常方便的圖論演算法。

如果圖是一顆樹的話,把樹畫出來,可以看出任意兩點a,b間距離d[a][b]=dis[a]+dis[b]-2*dis[k],k是a,b的最近公共祖先。

所以只要一遍spfa,然後運用lca  tarjin離線演算法把訪問點對的最近公共祖先求出來即可。

下面是hdu2874的**,也可以用來當模板

#include#include#include#include#include#define maxn 10010

using namespace std;

struct pi

pp[2*maxn];

struct ppi

;ppi pp1[200*maxn];

int head[maxn],tot,vis[maxn],ed,head1[maxn],fa[maxn];

int dis[maxn],use[100*maxn];

void add(int a,int b,int cost)

void add1(int a,int b,int id)

int find(int a)

void lca(int v,int pa,int to)

}for(i=head[v];i!=-1;i=pp[i].next)

return ;

}int main()

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

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

to=0;

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

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

}return 0;

}

弗洛伊德演算法(求各頂點間最短路徑) 可列印最短路徑

include include include using namespace std define infinity 65535 define max vertex num 10 typedef struct mgraphmgraph int locatevex mgraph g,string u...

Bellman Ford演算法求最短路

圖論中比較基礎的問題,求單源最短路,即在圖中找乙個點作為起點,求他到其他點的最短路,而bellman ford演算法是其中最簡單的演算法,相應地,其複雜度也比較高,效率也比較低,但是,他卻可以判斷圖中是否存在負權迴路 走一圈經過的權值是負數 因此可以處理帶有負權邊的圖,且該演算法是其他各種最短路演算...

dijkstra演算法求最短路

演算法思想 用乙個dis陣列記錄源點到其他各點的路徑,例如 如果v0是源點,那麼dis 1 就表示v0到v1的最短距離 用乙個vis陣列記錄頂點有沒有被當成出發點。如果第乙個出發點 源點 到別的點的路都已經走完了,那就找一下個目前距離源點最近的點作為出發點,標誌為1。然後繼續尋找最短路徑,如果dis...