最短路SPFA
用邻接矩阵a表示一幅图,a[i][j]表示从点i到点j的边长,如果为0则无边.(这是无负边,0边的情况)
这张图有T个点,C条边,要求求出从Ts走到Te的最短路.
用f[i]表示从Ts走到i点的最短路(这是动态规划思想),那么最后的答案就是f[Te].
与广搜类似,用一个数组q来表示队列,h是队头指针,t是队尾指针,直到h>=t就扫完了,停止入队,用布尔数组b表示点是否在队列内.
伪代码:
while (没扫完)
{
队头出队;
b[新的对头]=false;//因为只要有更短的路径就可以重复入队
for (扫一遍所有点)
if (q[h]到i间有边 且 q[h]到i的边加上Ts到q[h]的边比Ts到i的路要短)
{
Ts到i的最短路为q[h]到i的边加上Ts到q[h]的边;
if (i不在队内)
i入队;
}
}
注意:只要有更短的路径就可以重复入队,因此q就要开得大一点.
好吧,我现在还没有AC一道题,只得了70分,代码放上来请大家帮我看看.我用C++STL里面的队列再做一下.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <climits> using namespace std; int T, C, Ts, Te, a[][], f[], q[], h = , t = ;
bool b[];
int main()
{
memset(a, -, sizeof(a));
memset(b, , sizeof(b));
scanf("%d%d%d%d", &T, &C, &Ts, &Te);
for (int i = ; i <= T; i++)
f[i] = INT_MAX / ;
for (int i = , Rs, Re, ci; i <= C; i++)
{
scanf("%d%d%d", &Rs, &Re, &ci);
a[Rs][Re] = a[Re][Rs] = ci;
}
f[Ts] = ;
q[] = Ts;
b[] = true;
while (h <= t)
{
h++;
b[h] = false;
for (int i = ; i <= T; i++)
if ((a[q[h]][i] > ) && (a[q[h]][i] + f[q[h]] < f[i]))
{
f[i] = a[q[h]][i] + f[q[h]];
if (!b[i])
{
t++;
b[i] = true;
q[t] = i;
} }
}
cout << f[Te];
return ;
}
最短路SPFA的更多相关文章
- 最短路模板(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 ...
- POJ 3835 & HDU 3268 Columbus’s bargain(最短路 Spfa)
题目链接: POJ:http://poj.org/problem?id=3835 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=3268 Problem ...
随机推荐
- MySQL的环境变量
MySQL的环境变量 服务器变量:调整MySQL的工作属性,由MySQL的配置文件决定 状态变量:MySQL运行以后所输出的自身统计信息 在Linux下查看MySQL的环境变量 1.获取MySQL客户 ...
- 利用Linux系统生成随机密码的10种方法
Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...
- php练习7——类的运用(四则运算or面积计算[javascript小技巧——根据需求显示不同界面])
要求:请编写一个类,该类可以进行四则运算,也可以进行矩形面积计算 1.程序 viewCount.html Count.class.php printCount.php 2.结果 ...
- div+css3实现漂亮的多彩标签云,鼠标移动会有动画
div+css3实现漂亮的多彩标签云,鼠标移动会有动画 点击运行效果 <style> .dict { margin: 20px 0;clear:both ;text-align:left; ...
- odoo 清除所有运行数据
测试odoo,如果需要一个干净的db.经常需要清除掉所有业务数据.做如下操作,较为方便 1:建立一个服务器动作,动作的python代码入下. 然后新建一个菜单,菜单动作关联到 这个动作.需要清空db, ...
- CentOS下Redis 2.2.14安装配置详解(转载)
一. 下载redis最新版本2.2.14 cd /usr/local/src wget –c http://redis.googlecode.com/files/redis-2.2.14.tar.gz ...
- centos6.5搭建vpn服务器
1 安装ppp yum install -y ppp 2 安装pptpd yum install pptpd // rpm -Uvh http://poptop.sourceforge.net ...
- 【面试】蘑菇街产品运营二面&结果
2015-08-25 今天下午大概三点半接到了杭州的电话,是蘑菇街的面试官,面试官一开始就说我们简单做个15分钟的面试吧.首先,让我做一个与产品经历相关的自我介绍,我说了自己的产品实习和两个产品比赛经 ...
- ArrayList与LinkedList实现比较
1.ArrayList实现是基于数组来实现的,这可由ArrayList的源码看出: public class ArrayList<E> extends AbstractList<E& ...
- 【HDU 3949】 XOR (线性基,高斯消元)
XOR Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...