随手一打就是标准的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]);
}
}
}
}

最新文章

  1. 【.NET深呼吸】(WPF)跨窗口完成绑定
  2. [JSP]自定义标签库taglib
  3. Create function through MySQLdb
  4. List集合转换为数组形式
  5. ibatis 的 &quot;This SQL map does not contain a MappedStatement&quot;的错误
  6. android 上下文菜单详解
  7. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range st 二分
  8. gtest框架使用
  9. 自定义函数实现NULL值替换
  10. listview异步加载sd卡图片
  11. [Linked List]Delete Node in a Linked List
  12. PHP正在进行时-变量
  13. 部分安卓机型1px边框无法显示解决方法
  14. es6学习日记5-对象的扩展
  15. 详解 Java NIO
  16. Python Machine Learning-Chapter4
  17. 大量删除MySQL中的数据
  18. 让IE6/IE7/IE8支持HTML5标签的js代码
  19. Android ListView工作原理完全解析(转自 郭霖老师博客)
  20. git代码版本回退

热门文章

  1. jsp 添加jstl标签
  2. 软件测试面试题-适合零基础和工作多年的re
  3. [Linux] umount目录提示device is busy的解决方法
  4. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和
  5. HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)
  6. 最大流——EK算法
  7. winform 根据两点求出线上所有点及画出这条线
  8. LTE QCI分类 QoS
  9. lnmp1.4,400,500,错误
  10. C# 获取方法所在的 命名空间 类名 方法名