您的位置:首页 > 编程语言 > C语言/C++

单源最短路模板_SPFA_Dijkstra(堆优化)_C++

2016-10-06 21:40 441 查看
  随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点

void spfa()
{
int i,x,k;
for (i=2;i<=n;i++)
{
d[i]=oo;
f[i]=1;
}
d[1]=0;
q.push(1);
while (!q.empty())
{
x=q.front();
q.pop();
f[x]=1;
for (i=first[x];i;i=next[i])
{
k=v[i];
if (d[k]>d[x]+w[i])
{
d[k]=d[x]+w[i];
if (f[k])
{
q.push(k);
f[k]=0;
}
}
}
}
}


  Dijkstra+堆优化,调了我3个多小时终于调到正确的最优的模板

void down(int x)
{
x<<=1;
if (x>t) return;
if (x<t&&d[s[x+1]]<d[s[x]]) x++;
if (d[s[x]]>=d[s[x>>1]]) return;
swap(s[x],s[x>>1]);
swap(p[s[x]],p[s[x>>1]]);
down(x);
}
void up(int x)
{
if (x==1||d[s[x>>1]]<=d[s[x]]) return;
swap(s[x],s[x>>1]);
swap(p[s[x]],p[s[x>>1]]);
up(x>>1);
}
void dijkstra()
{
int i,x,k;
t=s[1]=1;
for (i=2;i<=n;i++) d[i]=oo;
while (t)
{
x=s[1];
s[1]=s[t--];
p[s[1]]=1;
p[x]=-1;
down(1);
for (i=first[x];i;i=next[i])
{
k=v[i];
if (p[k]==-1) continue;
if (!p[k])
{
s[++t]=k;
p[k]=t;
}
if (d[k]>d[x]+w[i])
{
d[k]=d[x]+w[i];
up(p[k]);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: