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