最短路小結

2021-09-10 16:48:01 字數 3417 閱讀 5531

通過對最短路的學習,我已經部分掌握了3大演算法及其變形,會用一些知識去解決問題,但學無止境,仍有許多知識我知之甚少,我希望通過我的努力會變得越來越強。

floyd經典演算法適合多源最短路,由於複雜度較高,適合資料較小的題目,但也有些題目可由floyd的變形去做。dijkstra演算法為單源最短路,主要思想就是將所有的頂點分成2部分,已知最短路程的集合p和未知最短路程的集合q,用vis陣列標記該點是否在集合p中(為1表示在),然後在集合p中選擇乙個離源點最近的點u來鬆弛與u相連的點,通過堆優化的dijkstra複雜度大大降低,實為一種好演算法。bellman-ford演算法和spfa演算法可判負環,spfa即為佇列優化的bellman-ford演算法,bellmanford通過第n次是否仍然更新dis陣列來判定負環的存在,spfa通過判定乙個點入隊的次數是否超過n次來判定負環的存在。遇到二維的題目可由map和pair的相互照應來對映為點的存在形式,進而轉化為一般的題目求解。

一:floyd模板--------------------------------->

#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

int m,n,dis[111][111];

void floyd()}}

}int main()

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

floyd();

cout《二:dijkstra模板--------------------------------->

1:原始模板

#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

int a[111][111],dis[111],vis[111];

int n,m;

void dijkstra(int s)}}

}int main()

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

dijkstra(1);

cout<2:堆優化+前向星版本

#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=100011;

typedef pairp;

int head[maxn],dis[maxn],vis[maxn];

int n,m,cnt;

struct edge

e[maxn];

void init()

void add(int u,int v,int w)

void dijkstra(int s)}}

}int main()

dijkstra(1);

cout<3:堆優化+vector版本:

#include#include#include#includeusing namespace std;

typedef pairp;

const int inf=0x3f3f3f3f;

const int maxn=100111;

int dis[maxn],vis[maxn];

int n,m,cnt;

struct edge

;vectore[maxn];

void init()

void dijkstra(int s)}}

}int main()

); e[v].push_back((edge));

}dijkstra(1);

cout《三:bellman-ford模板

1:原始模板

#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=100010;

int dis[maxn];

int n,m,cnt;

struct edge

e[maxn];

void add(int u,int v,int w)

void bellman_ford(int s)

}}int main()

bellman_ford(1);

cout<2:bellman-ford判負環

#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=100010;

int dis[maxn];

int n,m,cnt;

struct edge

e[maxn];

void add(int u,int v,int w)

int bellman_ford(int s)

}if(flag==0) //優化

break;

}for(int i=1; i<=m*2; i++)

}return 0;

}int main()

int x=bellman_ford(1);

if(x==1)

cout<<"存在負環"《四:spfa(佇列優化的bellman-ford)模板--------------------------------------------->

1:前向星版本

#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=100010;

int head[maxn],dis[maxn],vis[maxn];

int n,m,cnt;

struct edge

e[maxn];

void init()

void add(int u,int v,int w)

void spfa(int s)}}

}int main()

spfa(1);

cout<2:vector版本

#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=100010;

int dis[maxn],vis[maxn];

int n,m;

struct edge

;vectore[maxn];

void init()

void spfa(int s)}}

}int main()

); e[v].push_back((edge));

}spfa(1);

cout<}

return 0;

}

最短路問題 小結

分類 小結 2014 06 06 14 57 93人閱讀收藏 舉報最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包括 確定起點的最短路徑問題 即已知起始結點,求最短路徑的問題。確定終點的最短路徑問題 與確定起點的問題相反,該問題...

最短路演算法小結

dijkstra演算法 適用於 無負權邊,無環 視所求得 最短 定義而論 的圖的單源最短路問題 也就是考慮乙個點 常用 dist i 陣列儲存源點 到 i 點的距離,應用貪心的思想,每次 從 未選 點集中 選出距離已選點集最近 最優 的乙個點,然後將此點加入已選點集,嘗試通過此點 更新 源點 到未選...

dijkstra最短路優化小結

堆優化把所有dish i 放在優先佇列中,取堆頂dist u 最小值更新 include include include define maxn 100001 define maxm 400001 using namespace std struct e int n,m,s,v maxm next ...