最短路之spfa系列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
输入保证至少存在1条商店到赛场的路线。
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
2
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std; struct edge {
int v, w;
edge(int v = , int w = ) : v(v), w(w) {}
}; int n, m, a, b, c;
int v[], d[]; vector<edge> G[]; void init() {
for(int i = ; i < ; i++) {
G[i].clear();
}
} void spfa() {
memset(v, , sizeof(v));
memset(d, 0x3f, sizeof(d));
d[] = , v[] = ;
queue<int> q;
q.push();
int x;
while(!q.empty()) {
x = q.front(), q.pop();
v[x] = ;
for(int i = ; i < G[x].size(); i++) {
int y = G[x][i].v, cost = G[x][i].w;
if(d[y] > d[x] + cost) {
d[y] = d[x] + cost;
if(!v[y]) {
q.push(y);
v[y] = ;
}
}
}
}
} int main() {
while(~scanf("%d%d", &n, &m)) {
if(n == && m == )
break;
init();
for(int i = ; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
G[a].push_back(edge(b, c));
G[b].push_back(edge(a, c));
}
spfa();
printf("%d\n",d[n]);
}
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
Here comes the problem: when you are on floor A,and you want to go to floor B,how many times at least he has to press the button "UP" or "DOWN"?
The first line contains three integers N ,A,B( 1 <= N,A,B <= 200) which describe above,The second line consist N integers k1,k2,....kn.
A single 0 indicate the end of the input.
3 3 1 2 5
0
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std; int n, a, b, x;
int v[], d[]; struct edge {
int v, t;
edge(int v = , int t = ) : v(v), t(t) {}
}; vector<edge> G[]; void init() {
for(int i = ; i < ; i++) {
G[i].clear();
}
memset(v, , sizeof(v));
memset(d, 0x3f3f3f3f, sizeof(d));
} void spfa(int s) {
d[s] = , v[s] = ;
queue<int> q;
q.push(s);
int x;
while(!q.empty()) {
x = q.front(), q.pop();
v[x] = ;
for(int i = ; i < G[x].size(); i++) {
int y = G[x][i].v, z = G[x][i].t;
if(d[y] > d[x] + z) {
d[y] = d[x] + z;
if(!v[y]) {
v[y] = ;
q.push(y);
}
}
}
}
} int main() {
while(~scanf("%d", &n) && n) {
init();
scanf("%d%d", &a, &b);
for(int i = ; i <= n; i++) {
scanf("%d", &x);
if(i + x <= n) {
G[i].push_back(edge(i + x, ));
//G[i+x].push_back(edge(i,1));
}
if(i - x >= ) {
G[i].push_back(edge(i - x, ));
//G[i-x].push_back(edge(i, 1));
}
}
spfa(a);
printf("%d\n", d[b] >= 0x3f3f3f3f ? - : d[b]);
}
return ;
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790
(1<n<=1000, 0<m<100000, s != t)
1 2 5 6
2 3 4 5
1 3
0 0
代码实现如下:
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std; struct edge {
int v, l, cost;
edge(int v = , int l = , int cost = ) : v(v), l(l), cost(cost) {}
}; int n, m, a, b, e, f, s, t;
int v[], d[], c[]; vector<edge> G[]; void init() {
for(int i = ; i < ; i++) {
G[i].clear();
}
memset(v, , sizeof(v));
memset(d, 0x3f, sizeof(d));
memset(c, 0x3f, sizeof(c));
} void spfa(int s) {
d[s] = , v[s] = , c[s] = ;
queue<int> q;
q.push(s);
int x;
while(!q.empty()) {
x = q.front(), q.pop();
v[x] = ;
for(int i = ; i < G[x].size(); i++) {
int y = G[x][i].v, p = G[x][i].l, val = G[x][i].cost;
if(d[y] >= d[x] + p) {
if(d[y] == d[x] + p) {
c[y] = min(c[y], c[x] + val);
} else {
c[y] = c[x] + val;
}
d[y] = d[x] + p;
if(!v[y]) {
q.push(y);
v[y] = ;
}
}
}
}
} int main() {
while(~scanf("%d%d", &n, &m)) {
if(n == && m == )
break;
init();
for(int i = ; i < m; i++) {
scanf("%d%d%d%d", &a, &b, &e, &f);
G[a].push_back(edge(b, e, f));
G[b].push_back(edge(a, e, f));
}
scanf("%d%d", &s, &t);
spfa(s);
printf("%d %d\n", d[t], c[t]);
}
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ; int T, n, m, a, b, tt;
int v[maxn], d[maxn], mp[maxn][maxn]; vector<int> G[maxn]; void init() {
for(int i = ; i < maxn; i++) {
G[i].clear();
}
memset(v, , sizeof(v));
memset(d, 0x3f3f3f3f, sizeof(d));
memset(mp, 0x3f3f3f3f, sizeof(mp));
} void spfa(int s) {
v[s] = , d[s] = ;
queue<int> q;
q.push(s);
int x;
while(!q.empty()) {
x = q.front(), q.pop();
v[x] = ;
for(int i = ; i < G[x].size(); i++) {
int y = G[x][i], z = mp[x][y];
if(d[y] > d[x] + z) {
d[y] = d[x] + z;
if(!v[y]) {
q.push(y);
v[y] = ;
}
}
}
}
} int main() {
while(~scanf("%d%d%d", &T, &n, &m)) {
init();
for(int i = ; i < T; i++) {
scanf("%d%d%d", &a, &b, &tt);
G[a].push_back(b);
G[b].push_back(a);
mp[a][b] = min(mp[a][b], tt);
mp[b][a] = min(mp[b][a], tt);
}
for(int i = ; i < n; i++) {
scanf("%d", &a);
spfa(a);
}
int mm = 0x3f3f3f3f;
for(int i = ; i < m; i++) {
scanf("%d", &a);
mm = min(mm, d[a]);
}
printf("%d\n", mm);
}
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake
虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。
――全剧终――
#include <map>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int n, num, cost;
string s1, s2;
int v[], d[]; struct edge {
int v, t;
edge(int v = , int t = ) : v(v), t(t) {}
}; vector<edge> G[]; void init() {
memset(v, , sizeof(v));
memset(d, 0x3f3f3f3f, sizeof(d));
for(int i = ; i < ; i++) {
G[i].clear();
}
} void spfa(int s) {
d[s] = , v[s] = ;
queue<int> q;
q.push(s);
int x;
while(!q.empty()) {
x = q.front(), q.pop();
v[x] = ;
for(int i = ; i < G[x].size(); i++) {
int y = G[x][i].v, z = G[x][i].t;
if(d[y] > d[x] + z) {
d[y] = d[x] + z;
if(!v[y]) {
q.push(y);
v[y] = ;
}
}
}
}
} int main() {
while(~scanf("%d", &n) && (n != -)) {
cin >>s1 >>s2;
num = ;
init();
map<string, int> id;
id[s1] = num++;
id[s2] = num++;
int s = id[s1], e = id[s2];
for(int i = ; i < n; i++) {
cin >>s1 >> s2 >>cost;
if(!id.count(s1)) {
id[s1] = num++;
}
if(!id.count(s2)) {
id[s2] = num++;
}
G[id[s1]].push_back(edge(id[s2], cost));
G[id[s2]].push_back(edge(id[s1], cost));
}
spfa(s);
printf("%d\n", d[e] >= 0x3f3f3f3f ? - : d[e]);
}
}
最短路之spfa系列的更多相关文章
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)
这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...
- POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...
- ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...
- 洛谷最短路计数SPFA
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
- UESTC30-最短路-Floyd最短路、spfa+链式前向星建图
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- 最短路(spfa)
http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Memory ...
- 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结
刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...
随机推荐
- lintcode-189-丢失的第一个正整数
189-丢失的第一个正整数 给出一个无序的正数数组,找出其中没有出现的最小正整数. 样例 如果给出 [1,2,0], return 3 如果给出 [3,4,-1,1], return 2 挑战 只允许 ...
- python获取本地时间
python本地时间 import time # 格式化成2016-03-20 11:45:39形式 now = time.strftime("%Y-%m-%d %H:%M:%S" ...
- SERVER 2008 R2 SP1下的内存虚拟盘(支持32位,64位的所有windows版本)
一时冲动把笔记本的系统换成了2008 R2 SP1的,本来想着用笔记本开HYPER-V的,结果是失败了,我发现我的4750G开了HYPER-V后CPU一直居高不下,其中有个什么系统软件保护的服务就占用 ...
- 织梦CMS建站入门学习(一)
一.下载与安装. 首先到织梦官网下载软件,可选择UTF8或GBK不同编码格式,如果电脑没有PHP环境,还要下载dede自带的PHP环境软件. 将软件中的upload文件夹内容复制到WWW文件夹下,然后 ...
- thinkPHP框架单一入口文件解析
一.index.php (可参考ThinkPHP学习手册http://document.thinkphp.cn/manual_3_2.html#entrance_file) index.php单入口 ...
- chrome extensions & debug
chrome extensions & debug debug background.js debug popup.js debug content_script.js chrome.stor ...
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...
- 【bzoj1821】[JSOI2010]Group 部落划分 Group Kruskal
题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了——聪 ...
- 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- nopi导出
1.NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com ...