只是想记录一下这三个最短路算法的模板。
Floyd:
//邻接矩阵mp[N][N];
//把各个点之间的最短路全算出来了。
//时间复杂度:O(n^3)
void floyd()
{
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
if(mp[i][k]!=inf)
for(int j=1; j<=n; j++)
{
if(mp[i][k]+mp[k][j]<mp[i][j])
{
mp[i][j]=mp[i][k]+mp[k][j];
}
}
}
}
}
Dijkstra:
//邻接矩阵mp[N][N]
//单源最短路
//时间复杂度:O(n^2)
void dijkstra(int b,int e)
{
for(int i=0;i<n;i++)
{
dis[i]=mp[b][i];
}
dis[b]=0;
flag[b]=1;
for(int i=1;i<=m;i++)
{
int min=MAX;
int k;
for(int j=0;j<n;j++)
{
if(!flag[j]&&min>dis[j])
{
min=dis[j];
k=j;
}
}
if(min==MAX) break;
flag[k]=1;
for(int j=0;j<n;j++)
{
if(!flag[j]&&dis[j]>dis[k]+mp[k][j])
{
dis[j]=dis[k]+mp[k][j];
}
}
}
}
//邻接矩阵mp[N][N] 邻接表直接看题吧
//单源最短路
//时间复杂度:O(kE) E为边数,k为所有顶点进队的平均次数
void spfa(int s)
{
queue<int> q;
while(!q.empty())
{
q.pop();
}
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
{
dis[i]=inf;
}
q.push(s);
dis[s]=0;vis[s]=1;
while(!q.empty())
{
int now=q.front();
q.pop();vis[now]=0;
for(int i=0;i<n;i++)
{
if(dis[i]>mp[now][i]+dis[now])
{
dis[i]=mp[now][i]+dis[now];
if(!vis[i])
{
q.push(i);
vis[i]=1;
}
}
}
}
}
还未学习Dijkstra SPFA的各种优化。