最短路 spfa+STL
与迪杰斯特拉相同的是spfa也是用来求单源点的最短路径问题,但是,当问题中的边是有向负边的时候,迪杰斯特拉就无能为力了,
而且给我的感觉是spfa如何结合STL来用的话代码比迪杰斯特拉的还要短一点,只是在思路上会比它稍微复杂一点点。spfa的原理:
同样设置一个数组d[maxn]用来保存源点到各点的距离,初始化为无穷打,同时定义一个队列que,初始化为空,然后还要定义一个数组visit[maxn],
用来标记当前的某个点是否在队列当中,初始化为false。算法第一步,把源点加入到队列中,然后用源点去更新源点到它可以到达的点的距离,
如果这个源点到这个点的距离可以被更新,而且队列中没有这个点的话,就把这个点加入到队列中。然后继续从队首弹出一个点,然后同理用这个点
去更新其它的点,重复下去直到队列为空,这时结果就出来了。下面是我A的第一个spfa的代码,用邻接表的,小小的纪念一下。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<deque>
using namespace std; typedef struct node
{
int d,len;
node *next;
}Linklist;
typedef struct Node
{
int tot;
Linklist *next;
Node()
{
tot = ;
next = NULL;
}
}linklist;
linklist rode[]; int d[],visit[];
void push(int u,int v,int l)
{
Linklist *q = new Linklist;
q->d = v;
q->len = l;
q->next = NULL;
rode[u].tot++;
if(rode[u].next == NULL)
{
rode[u].next = q;
return ;
}
Linklist *p = rode[u].next;
while(p->next)
p = p->next;
p->next = q;
} int main()
{
int n,m,u,v,l;
scanf("%d%d",&n,&m);
for(int i = ;i < m;++i)
{
scanf("%d%d%d",&u,&v,&l);
push(u,v,l);
}
deque<int> que;
deque<int>::iterator iter;
que.push_back();
memset(d,0x3f,sizeof(d));
memset(visit,,sizeof(visit));
visit[] = ;
d[] = ;
while(!que.empty())
{
int temp = *(que.begin());
que.pop_front();
visit[temp] = ;
Linklist *p = rode[temp].next;
while(p)
{
if(d[temp] + p->len < d[p->d])
{
d[p->d] = d[temp] + p->len;
if(!visit[p->d])
{
que.push_back(p->d);
visit[p->d] = ;
}
}
p = p->next;
}
}
for(int i = ;i <= n;++i)
printf("%d\n",d[i]);
return ;
}
最短路 spfa+STL的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- L - Subway(最短路spfa)
L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...
- ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))
求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一 ...
- POJ 1847 Tram --set实现最短路SPFA
题意很好懂,但是不好下手.这里可以把每个点编个号(1-25),看做一个点,然后能够到达即为其两个点的编号之间有边,形成一幅图,然后求最短路的问题.并且pre数组记录前驱节点,print_path()方 ...
- 【POJ】3255 Roadblocks(次短路+spfa)
http://poj.org/problem?id=3255 同匈牙利游戏. 但是我发现了一个致命bug. 就是在匈牙利那篇,应该dis2单独if,而不是else if,因为dis2和dis1相对独立 ...
- 【wikioi】1269 匈牙利游戏(次短路+spfa)
http://www.wikioi.com/problem/1269/ 噗,想不到.. 次短路就是在松弛的时候做下手脚. 设d1为最短路,d2为次短路 有 d1[v]>d1[u]+w(u, v) ...
- POJ 1511 最短路spfa
题很简单 就是有向图中求给出的源点到其余所有点的最短路的和与其余所有点到源点的最短路之和 一开始以为dij对于正权图的单源最短路是最快的 写了一发邻接表的dij 结果超时 把所有的cin改成scanf ...
- Layout---poj3169(差分约束+最短路spfa)
题目链接:http://poj.org/problem?id=3169 有n头牛站成一排 在他们之间有一些牛的关系比较好,所以彼此之间的距离不超过一定距离:也有一些关系不好的牛,希望彼此之间的距离大于 ...
- LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)
Extended Traffic 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/O Description Dhaka city ...
随机推荐
- 机器学习初入门02 - Pandas的基本操作
之前的numpy可以说是一个针对矩阵运算的库,这个Pandas可以说是一个实现数据处理的库,Pandas底层的许多函数正是基于numpy实现的 一.Pandas数据读取 1.pandas.read_c ...
- 微软职位内部推荐-SW Engineer II for Embedded System
微软近期Open的职位: Do you have a passion for embedded devices and services?   Does the following m ...
- 第二阶段冲刺——four
个人任务: 季方:实现团队博客作业查询. 王金萱:优化统计团队博客结果界面的显示. 马佳慧:选择功能界面的背景设计. 司宇航:用servlet完成名单打印功能. 站立会议: 任务看板和燃尽图:
- ElasticSearch 2 (29) - 信息聚合系列之测试驱动
ElasticSearch 2 (29) - 信息聚合系列之测试驱动 摘要 我们可以用以下几页定义不同的聚合和它们的语法,但学习聚合的最佳途径就是用实例来说明.一旦我们获得了聚合的思想,以及如何合理地 ...
- Android 图表
今天在群里有人提问Android的图表,在网上搜索了一下,在贴吧中看到的回答,说是Trinea整理的开源项目,不知道是不是博客上的Trinea. 将内容记录如下,以备需要时查看. GraphView ...
- java 堆和栈二
1.数组 整数默认初始化值0 浮点数默认初始化值0.0 布尔类型默认初始化值false 字符类型默认初始化值\u0000 [I@7852e922 [有几个代表是几维数组 I代表是Int类型 @固定格式 ...
- 洛谷P2114 [NOI2014]起床困难综合症
P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...
- Codeforces ECR50 div2题解
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- ssm框架配置过程
1.pom.xml配置 1.1<build>标签中配置<plugins>和<resources>,即插件和资源文件 1.2 <properties>标签 ...
- 51nod 1577 异或凑数
思路真的是挺巧妙的. 让我惊叹,原来线性基还能这么做?!?! 好吧,这种取若干个数异或凑数的题目怎么能少的了线性基呢? 但是,问题集中在于怎么快速提取一个区间的线性基 暴力n^2 线段树维护线性基?分 ...