题目1008:最短路径问题(SPFA算法)
问题来源
http://ac.jobdu.com/problem.php?pid=1008
问题描述
给定一个G(V,E)有向图,起点s以及终点t,求最短路径。
问题分析
典型的单源最短路径问题,可以有多种方法完成。代码中采用的是SPFA算法。
注意:这里面在相等的最短路径时,要去花费最小的那条,需要多比较一下。
另外,我写了一篇最短路径四大算法总结,请参考:http://www.cnblogs.com/AlvinZH/p/6789912.html
参考代码
//
// Created by AlvinZH on 2017/4/29.
// Copyright (c) AlvinZH. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <string>
#include <queue>
using namespace std; #define MAX 1010
#define INF 0x3f3f3f3f int dis[MAX];//dis[i]表示起点到i的最短距离
int cost[MAX];//cost[i]表示起点到i的花费
bool vis[MAX];//是否访问过点i struct node
{
int dis,cost;
}map[MAX][MAX]; int n,m,a,b,d,p,s,t; void SPFA()
{
for(int i=;i<=n;i++)//初始化
{
dis[i]=INF;
cost[i]=INF;
vis[i]=false;
}
queue<int> q;
q.push(s);
dis[s]=;
cost[s]=;
vis[s]=true; while(!q.empty())
{
int cur=q.front();
q.pop();
vis[cur]=false;
for(int i=;i<=n;i++)
{
if(map[cur][i].dis!=INF&&dis[i]>=dis[cur]+map[cur][i].dis)
{
dis[i]=dis[cur]+map[cur][i].dis;
cost[i]=min(cost[i],cost[cur]+map[cur][i].cost);
if(!vis[i])
{
vis[i]=true;
q.push(i);
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n&&m)
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
map[i][j].dis=INF;
map[i][j].cost=INF;
} for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
map[a][b].dis=map[b][a].dis=d;
map[a][b].cost=map[b][a].cost=p;
}
scanf("%d%d",&s,&t);
SPFA();
printf("%d %d\n",dis[t],cost[t]);
}
return ;
}
作者: AlvinZH
出处: http://www.cnblogs.com/AlvinZH/
本人Github:https://github.com/Pacsiy/JobDu
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
题目1008:最短路径问题(SPFA算法)的更多相关文章
- 【最短路径】 SPFA算法
上一期介绍到了SPFA算法,只是一笔带过,这一期让我们详细的介绍一下SPFA. 1 SPFA原理介绍 SPFA算法和dijkstra算法特别像,总感觉自己讲的不行,同学说我的博客很辣鸡,推荐一个视频讲 ...
- 【最短路径】 SPFA算法优化
首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...
- 【最短路径】 常用算法图解+1376:信使(msner)六解
进入图之后,最短路径可谓就是一大重点,最短路径的求法有很多种,每种算法各有各的好处,你会几种呢?下面来逐个讲解. 1 floyed算法 1)明确思想及功效:在图中求最短路还是要分开说的,分别是单源最短 ...
- 题目1008:最短路径问题(最短路径问题dijkstra算法)
题目链接:http://ac.jobdu.com/problem.php?pid=1008 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍
这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...
- [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)
单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...
- 最短路径问题的Dijkstra和SPFA算法总结
Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...
- 最短路径--SPFA 算法
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- Bellman-Ford & SPFA 算法——求解单源点最短路径问题
Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...
随机推荐
- RTX二次开发笔记2
问题一:关于DLL文件的引用 在安装文件夹内 APIObject.dll==>RTXSAPI.dll 服务器API接口 RTXCAPI.DLL ==> 客户端API接口 问题二:RTX二次 ...
- 手工创建Oracle数据库
数据库版本: SQL> select * from v$version; BANNER ----------------------------------------------------- ...
- springboot之JdbcTemplate单数据源使用
本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...
- [GO]文件的收发服务器
发送方 package main import ( "fmt" "os" "net" "io" ) //发送文件内容 f ...
- CodeForces 347A Difference Row (水题)
题意:给定 n 个数,让你找出一个排列满足每个数相邻作差之和最大,并且要求字典序最小. 析:这个表达式很简单,就是把重新组合一下,就成了x1-xn,那么很简单,x1是最大的,xn是最小的,中间排序就好 ...
- C#中继承和构造函数
一个类继承自另外一个类,他们的构造函数改怎么办? 首先必须先声明:构造函数是不能继承的 我们先看一段代码:第一段代码没有构造函数,第二段有一个,第三段有两个.从他们的MSIL可以看出,有几个构造函数就 ...
- zrender源码分析4--初始化Painter绘图模块2
入口2: 渲染 // zrender_demo.html zr.render(); // zrender.js /** * 渲染 * * @param {Function} callback 渲染结束 ...
- 移动开发iOS&Android对比学习--异步处理
在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...
- android多lib库工程的自动批量构建--编写ant脚本
基本配置--build.properties 首先编写基本配置build.properties ,主要配置如下: android sdk所在目录 编译项目所使用的项目版本 Jdk所在目录 以及签名时, ...
- Python之迭代器,生成器与装饰器
1>迭代器原理及使用: 1>原理: 迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束:迭代器只能往前不会后退,不过这也没什 ...