图论浅析--最短路之SPFA
SPFA
SPFA即Shortest Path Faster Algorithm,求单源最短路。
在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作。
松弛操作必定只会发生在最短路径前导节点松弛成功过的节点上,用一个队列记录松弛过的节点,可以避免了冗余计算。复杂度可以降低到O(kE)。(注:一般k<=2,也可能很大)
Code
struct Edge
{
int v;
int cost;
};
vector<Edge>E[NUM];
int n;
bool vis[NUM];//在队列标志
int cnt[NUM];//每个点的入队列次数,用来判定是否存在负环回路
int dist[NUM];
queue<int>q;
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
bool SPFA(int start)
{
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) dist[i]=INF;
while(!q.empty())q.pop();
dist[start]=0;
vis[start]=true;
q.push(start);
cnt[start]=1;
while(!q.empty())
{
int u=q.front(); q.pop();
vis[u]=false;
for(int i=0;i<E[u].size();i++)
{
int v=E[u][i].v;
if(dist[v]>dist[u]+E[u][i].cost)
{
dist[v]=dist[u]+E[u][i].cost;
if(!vis[v])
{
q.push(v);
vis[v]=true;
if(++cnt[v]>n) return false;
}
}
}
}
return true;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。