通過對最短路的學習,我已經部分掌握了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 ...