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正则表达式匹配用户名规则:由字母开头的6-16位字母和数字组成的字符串

    $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9]{5,15}$/i';

  2. django book

    一.安装配置 1.下载地址: https://www.djangoproject.com/download/ 2.安装: tar zxvf Django-1.6.1.tar.gz && ...

  3. 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX

    从网上抓了一些字节流,想打印出来结果发生了一下错误: UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position ...

  4. WCF服务显示的是服务器名称而不是IP地址...

    打开http://xx.xx.xx.xx:端口号/Service1.svc页面显示的服务地址为: http://xx_yy_server:端口号/Service1.svc?wsdl 是显示的服务器的名 ...

  5. javascript高级程序设计---Event对象三

    进度事件 进度事件用来描述一个事件进展的过程,比如XMLHttpRequest对象发出的HTTP请求的过程.<img>.<audio>.<video>.<st ...

  6. centos 6.5 zabbix3.0.4 监控apache

    开启apache的server-status httpd.conf 末尾添加 [root@test3 /]# vim /usr/local/httpd-/conf/httpd.conf Extende ...

  7. 第五章第二例题关于Vector(LRJ)

    vector(动态数组)(粘) 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简 ...

  8. BZOJ3277——串

    0.题意:给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). 1.分析:这个题我问了吴大爷做法 首先建立后缀自动机,然后利用离线搞出每一个 ...

  9. 几个简单实用的css效果

    1.要使按钮具有3D效果,只要将它的左上部分边框设置为浅色,右下部分边框设置为深色即可. eg:#button { background: #888; border: 2px solid; borde ...

  10. unity销毁层级物体及 NGUI 深度理解总结

    http://www.2cto.com/kf/201311/258811.html 1.想找到层级面板中某个物体,并销毁,利用下面的代码:    GameObject  obj = GameObjec ...