spfa作为图论中的常用算法,深受各类出题人和各位OIer的喜爱;

    so,为了给大众创造福利,宝宝在此奉上spfa大发的思路和模板;以感谢社会,

感谢CCF,感谢CCTV,

感谢我的老师,感谢同学们,

感谢noi,感谢noip,感谢ioi,

感谢不辞辛劳的学长学姐,

感谢帮我改程序,被我烦死的xxy ~QAQ~······and so on;

程序和图解做得比较难看,就请大家见谅了!!~(≧▽≦)/~ 谢啦!!☆⌒(*^-゜)v

思路:见程序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int v,x,y,n;
int head[],num,m,dis[];
bool vis[];
struct nond
{
int pre,v,to,from;
//pre指这条边的上一条边,v指这条边的边权,to指这条边的终点,from至这条边的终点;
}e[];//边表存储,减少空间占用;
queue<int>q;//队列存储所能更新的点;
void put(int from,int to,int v)
{
e[++num].pre=head[from];
e[num].from=from;//
e[num].to=to;
e[num].v=v//;这三句很好理解不解释
head[from]=num;
}//边表的读入函数;
/*重点解释一下对于改变的上一条边的存储,
看程序下的图片详解,在此不进行解释;*/
void spfa(int s)
{
q.push(s);//把s放入队列中;
vis[s]=;//把节点s标记为使用中;
int point=s;//用point去更新所有与point相连的节点的最短距离;
while(!q.empty())//如果队列不为空,说明有节点能去更新其他节点;
{
point=q.front();//记录队列中的第一个节点去更行其他节点;
q.pop();//队列中的第一个节点已被使用,弹出;
vis[point]=;//该节点被弹出了队列,变为未被访问,未被使用;
for(int i=head[point];i;i=e[i].pre)//以该节点去更新其他节点
{
if(dis[e[i].from]+e[i].v<dis[e[i].to])//自己理解,不解释
{
dis[e[i].to]=dis[e[i].from]+e[i].v;
q.push(e[i].to);
//节点i的最短距被更新过,说明i又可以去更新其他节点,把i读入队列;
vis[e[i].to]=;//标记为使用中;
}
}
}
}
int main()
{
cin>>n>>m;//n节点个数,m是边的个数;
memset(dis,/,sizeof(dis));
dis[]=;//dis存储到第i个点的最短路的长度;
for(int i=;i<=m;i++){
cin>>x>>y>>v;//x,y,v分别是相连边的起点~终点~长度;
put(x,y,v);//向边表里加入边
put(y,x,v);//因为是无向图,所以加入两次;
}
spfa();//spfa搜索!!!这是重点!注意了~(≧▽≦)/~
for(int i=;i<=n;i++)
cout<<dis[i]<<" ";
}

如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88

spfa(模板)的更多相关文章

  1. SPFA模板 Bellmanford优化版

    SPFA模板: queue<int>Q; ]; ],sumv[]; *],__next[*],e,w[*],first[],cnts[]; void AddEdge(int U,int V ...

  2. floyed dij spfa 模板

    /* SPFA模板 */ const int inf=0x3f3f3f3f; inline int SPFA(int s){ memset(dis,inf,sizeof(dis)); queue< ...

  3. spfa模板

    通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...

  4. 最短路算法 -- SPFA模板

    一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操 ...

  5. hdu-2544-最短路(SPFA模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

  6. spfa模板+讲解

    zz http://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.html Spfa算法 (模板源代码) 这是Bellman Ford的改进算法.    算法介绍: ...

  7. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  8. UVA 558 判定负环,spfa模板题

    1.UVA 558 Wormholes 2.总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了..难道next还是特殊词吗 题意:科学家, ...

  9. Dijkstra堆优化与SPFA模板

    Dijkstra+优先队列 #include<cstdio> #include<cctype> #include<queue> #include<cstrin ...

随机推荐

  1. PHP利用Curl实现多线程抓取网页和下载文件

    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...

  2. 大熊君大话NodeJS之------FS文件模块

    一,开篇分析 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集.可以通过调用 require("fs") 来获取该模块.文件系统模块中的所有方法均有异步和同步 ...

  3. glusterFS分布式文件系统的搭建

    准备工作 1.安装IBA yum install libradmacm librdmacm-devel libmlx4 infiniband-diags 2.配置IPOIB /etc/sysconfi ...

  4. 格式化Double类型

    //格式化Double类型 //F:默认是2位小数点 //F6:输出小数点后6位,不够的话用0补齐 //G:默认输出原先的,保留小数点后面的位数 LalTotal.Text = "合计:原始 ...

  5. javascript 正则表达式使用

    切记:js 正则表达式无需用双引号,正则表达式不是字符串. 参考网址:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 个人用于查找字条串匹配 ...

  6. redis-string1

    package com.ztest.redis.string; import com.sun.istack.internal.logging.Logger;import com.ztest.redis ...

  7. JSP自定义标签之Hello Costom tag小例子

    1.项目结构 2.实现自定义tag所需依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId ...

  8. gc是什么,什么时候需要gc

    Java是由C++发展来的. 它摈弃了C++中一些繁琐容易出错的东西.其中有一条就是这个GC. 写C/C++程序,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值.内存再大也是有限的,所以 ...

  9. PHP四种基础算法详解

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

  10. 剑指Offer 顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...