题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2680

题目大意,就是一个人可以从多个起点开始出发,看到终点的最短路是多少。。只有可以运用和hdu2066一样的思想,对于每个起点可以看成是跟最最开始的点之间有一条权值为0的边。可以把最开始的点记做0点。那这样就可以使用单源最短路了。之前都没有用过spfa,今天来运用了一下。

算法大致流程是用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。

这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法

 

总结一下,spfa就是在bellmanford的基础之上运用了一个队列来进行优化,思想就是如果这个点的最短距离被更新且他不在队列中就加入队列,如果在就不需要重复加入队列。。因为当他取出来的时候已经是最后一次被更新过的值了。这样就避免了多次重复的操作。。反观bellman-ford未优化的话,要对于每一条边进行n-1次的松弛操作,从而来试图更新每条边终点的最短距离,而spfa就直接从一开始的起点出发找出相邻的边,判断是否能更新,并判断是否要加入队列(已在队列中就不加),这样就减少了很多更新的次数。

例题 hdu 2680

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define M 1009
#define INF 0x3f3f3f3f
struct edge
{
int to,w;//保存边的信息,包括边的终点以及权值
};
int dis[M]; //最短距离的估计值(当前该点的最短距离)
bool inq[M]; //标记该点是否在队列之中
vector<edge> g[M]; //利用一个vector保存,g[i]表示以i为起点的所有边的信息
int n,m,ee;
void spfa(int u)
{
for(int i = ;i <= n;i++) //初始化
{
dis[i] = INF; //将估计值都初始化为INF
inq[i] = false; //初始化为不在队列中
}
dis[u] = ; //起点的估计值直接就是0
inq[u] = true; //加入队列并进行标记
queue<int> q;
q.push(u);
while(!q.empty())
{
u = q.front();
inq[u] = false;
q.pop();
for(int i = ;i < g[u].size();i++)
{
int v = g[u][i].to; //找出这条边对应的终点
int w = g[u][i].w; //这条边对应的权值
if(dis[v] > dis[u]+w) //如果终点的最短距离比起点的最短距离加上这条边的权值那么就更新
{
dis[v] = dis[u]+w;
if(!inq[v]) //如果v点的最短距离有所更新并且不在队列中,就将其加入队列。
{ //否则就不需要重复加入队列增加不必要的操作。
inq[v] = true; //加入队列并标记
q.push(v);
}
}
}
}
}
int main()
{
while(scanf("%d %d %d",&n,&m,&ee)==)
{
for(int i = ;i <= n;i++) //清空vector避免多kase相互影响
g[i].clear();
for(int i = ;i < m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
edge e;
e.to = b;e.w = c;
g[a].push_back(e);
//e.to = a;
//g[b].push_back(e); //题目中有说从a到b有这条路,并不是双向的。
}
int s;
scanf("%d",&s);
for(int i = ;i < s;i++)
{
int a;
scanf("%d",&a);
edge e;
e.to = a; e.w = ;
g[].push_back(e); //将家里到起点的权值设为0
//e.to = 0;
//g[a].push_back(e); //从起点到家里是否有路其实无关紧要,因为思考一下有路的话 起点到起点也是0,所以根本不影响结果
}
spfa();
//printf("debug-----%d\n",dis[ee]);
if(dis[ee]==INF)
printf("-1\n");
else
printf("%d\n",dis[ee]);
}
return ;
}

HDU - 2680 最短路 spfa 模板的更多相关文章

  1. HDU 2544 最短路 SPFA 邻接表 模板

    Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想 ...

  2. hdu-2544-最短路(SPFA模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

  3. hdu 2544 最短路 (spfa)

    最短路 Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  4. HDU 2544 最短路(模板题——Floyd算法)

    题目: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你 ...

  5. 最短路SPFA模板

    // // dijkstra妯℃澘.cpp // algorithm // // Created by david.xu on 2018/8/6. // Copyright 漏 2018骞?david ...

  6. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  8. HDU 2544最短路dijkstra模板题

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. hdu 2680(最短路)

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. ubuntu 软件管理

    软件安装管理 安装软件 sudo apt-get install **** 检索软件 sudo apt-cache search **** 更新源 sudo apt-get update   **** ...

  2. js实现td排序及分组分类

    如题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  3. Redis中connect和pconnect的区别

    首先先介绍下connect和pconnect的区别.connect:脚本结束之后连接就释放了. pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中.所以使用pconnect代替c ...

  4. c++之模板

    . 函数模板 普通函数 void Swap(int &, int &); 模板函数 template <typename T> void Swap(T &, T & ...

  5. 2.10 工具使用 after effects(图形视频处理软件)

    ................... ..................... 暂无 教程素材网 http://img.yipinsucai.com/

  6. 35W行数据的文本文件,每500行添加4个换行符。代码实现思路

  7. java基础增强

    Eclipse使用: java Compile配置的是java编译环境 java Build path配置的是java运行环境 运行环境的版本必须高于编译环境的版本.否则报错 工程上 右键--prop ...

  8. LoadRunner 技巧之协议分析(五)

    在做性能测试的时候,协议分析是困扰初学者的难题,选择错误的协议会导致Virtual User Generator 录制不到脚本:或录制的脚本不完整,有些应用可能需要选择多个协议才能完整的记录 客户端与 ...

  9. Git学习 -- 分支管理

    创建新分支,并切换到该分支 git checkout -b dev 这一句相当于以下两句: git branch dev 创建 git checkout dev 切换 查看当前分支 git branc ...

  10. 逆序一个8bit的2进制数