最短路
floyed
枚举外层 k,再枚举内层 i 与 j,这样就能得到从 i 到 j 的最短路径. 它是多源最短路径算法.
时间复杂度 O(n3).
inline void floyed()
{
memset(dis,0x3f,sizeof(dis));for(rll i=1;i<=n;i++) dis[i][i]=0;
for(rll k=1;k<=n;k++)
for(rll i=1;i<=n;i++)
for(rll j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
dijkstra
基于贪心的算法,每次选择一条最短的路径的点继续往下递归.
时间复杂度 O(n log n + E)(E 是边数).
dijkstra 为单源最短路径算法,它不能处理负边权情况.
#define pll pair<ll,ll>
priority_queue<pll,vector<pll>,greater<pll> > q;
inline void dij(rll x)
{
memset(dis,0x3f,sizeof(dis));
dis[x]=0;q.push((pll) { x,0 });
while(!q.empty())
{
rll t=q.top().second;q.pop();
for(rll i=0;i<g[t].size();i++)
{
rll to=g[t][i].first;
if(dis[to]>dis[t]+g[t][i].second)
dis[to]=dis[t]+g[t][i].second,
q.push((pll) { to,dis[to] });
}
}
}
spfa
关于 spfa:它死了.

把每一个点放进队列里,不断递归(队列)更新最短路径.
复杂度 O(nE).
queue<ll> q;
bool fl[maxn];
inline void spfa(rll x)
{
memset(dis,0x3f,sizeof(dis));dis[x]=0;q.push(x);fl[x]=1;
while(!q.empty())
{
rll t=q.front();q.pop();fl[t]=0;
for(rll i=0;i<g[t].size();i++)
{
rll to=g[t][i].first;
if(dis[to]>dis[t]+g[t][i].second)
{
dis[to]=dis[t]+g[t][i].second;
if(!fl[to]) { q.push(to),fl[to]=1; }
}
}
}
}
--END--

浙公网安备 33010602011771号
我的博客: 𝟷𝙻𝚒𝚞
本文链接: https://www.cnblogs.com/1Liu/articles/16755748.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!