一丶Dijkstra
:
对于每一个点都进行松弛,一共松弛n-1次。每次都拿当前点,对于未加入图中的点进行松弛,核心代码:
for(int i=1;i<=n;i++)
{
minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn )
{
index=j;
minn=dis[j];
}
}
vis[index]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>mp[index][j]+dis[index])
{
dis[j]=mp[index][j]+dis[index];
}
}
}
二丶bellman-Ford
:
进行n-1次松弛,每次松弛一条边:
for(k=1;k<=n-1;k++)//进行n-1次松弛
for(i=1;i<=m;i++)//枚举一点
if(dis[v]>dis[u]+w[i])//尝试松弛
dis[v]=dis[u]+w[i];
队列优化:Spfa
int spfa()
{
queue <int > q;
for(int i=1;i<=n;i++)
dist[i]=inf,vis[i]=0,cnt[i]=0;
int cur=1;
q.push(cur);
vis[cur]=1;
cnt[cur]=1;
dist[cur]=0;
while(!q.empty())
{
cur=q.front();
q.pop();
vis[cur]=0;
for(int i=head[cur];i!=-1;i=edge[i].next)
{
int id=edge[i].to;
if(dist[id]>dist[cur]+edge[i].val )
{
dist[id]=dist[cur]+edge[i].val;
if(!vis[id])
{
cnt[id]++;
vis[id]=1;
q.push(id);
if(cnt[cur]>n)
return 1;
}
}
}
}
return 0;
}