单源最短路模板_SPFA_Dijkstra(堆优化)_C++
2024-09-04 18:22:49
随手一打就是标准的SPFA,默认1号节点为出发点,当然不用 f 判断是否在队里也可以,只是这样更优化一点
void spfa()
{
int i,x,k;
for (i=;i<=n;i++)
{
d[i]=oo;
f[i]=;
}
d[]=;
q.push();
while (!q.empty())
{
x=q.front();
q.pop();
f[x]=;
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]=;
}
}
}
}
}
Dijkstra+堆优化,调了我3个多小时终于调到正确的最优的模板
void down(int x)
{
x<<=;
if (x>t) return;
if (x<t&&d[s[x+]]<d[s[x]]) x++;
if (d[s[x]]>=d[s[x>>]]) return;
swap(s[x],s[x>>]);
swap(p[s[x]],p[s[x>>]]);
down(x);
}
void up(int x)
{
if (x==||d[s[x>>]]<=d[s[x]]) return;
swap(s[x],s[x>>]);
swap(p[s[x]],p[s[x>>]]);
up(x>>);
}
void dijkstra()
{
int i,x,k;
t=s[]=;
for (i=;i<=n;i++) d[i]=oo;
while (t)
{
x=s[];
s[]=s[t--];
p[s[]]=;
p[x]=-;
down();
for (i=first[x];i;i=next[i])
{
k=v[i];
if (p[k]==-) 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]);
}
}
}
}
最新文章
- 【.NET深呼吸】(WPF)跨窗口完成绑定
- [JSP]自定义标签库taglib
- Create function through MySQLdb
- List集合转换为数组形式
- ibatis 的 ";This SQL map does not contain a MappedStatement";的错误
- android 上下文菜单详解
- Codeforces Round #333 (Div. 2) B. Approximating a Constant Range st 二分
- gtest框架使用
- 自定义函数实现NULL值替换
- listview异步加载sd卡图片
- [Linked List]Delete Node in a Linked List
- PHP正在进行时-变量
- 部分安卓机型1px边框无法显示解决方法
- es6学习日记5-对象的扩展
- 详解 Java NIO
- Python Machine Learning-Chapter4
- 大量删除MySQL中的数据
- 让IE6/IE7/IE8支持HTML5标签的js代码
- Android ListView工作原理完全解析(转自 郭霖老师博客)
- git代码版本回退
热门文章
- jsp 添加jstl标签
- 软件测试面试题-适合零基础和工作多年的re
- [Linux] umount目录提示device is busy的解决方法
- 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和
- HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)
- 最大流——EK算法
- winform 根据两点求出线上所有点及画出这条线
- LTE QCI分类 QoS
- lnmp1.4,400,500,错误
- C# 获取方法所在的 命名空间 类名 方法名