不被世界看好的SPFA依旧强势-HDU2680

原创 2018年04月17日 00:12:19

记得第一次接触spfa是在高中的noip,那时候死记硬背过了pascal版本的优化之后的spfa。

当时的比赛还真用上了,因而水了个奖,毕竟学的不多,总共加起来学习pascal编程的时间不够7*24h。

看完了前情回顾,接下来就是见证奇迹的时刻,我要写spfa啦。


题目链接:HDU-2680

题目大意:一个人可以从多个起点开始出发,看到终点的最短路是多少。

题目分析:

1.如果我们把每个起点都spfa一次那么时间复杂度会加大很多。因而做个优化:设置一个0号位置,0号位置到每个起点都有一条路径,且这个路径的权重为0.这样,我们只需要从0号位置开始spfa一次就好啦。

2.选择邻接表存储图。(如果亲爱的读者大宝贝,邻接表忘记怎么实现的话,巴啦啦能量---->点我,我是邻接表的详解

3.spfa模板。(其实不需要模板的,spfa和bfs差不多的,如果你忘了的话,巴啦啦能量×2---->点我,我是spfa未优化的模板

所以实现如下:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MaxnEdge = 21010;
const int MaxnV = 1010;
const int INF = 0x3f3f3f3f;
int n, m, s;
int visit[MaxnV];
int dis[MaxnV];
int u[MaxnEdge], v[MaxnEdge], w[MaxnEdge];
int first[MaxnEdge], Next[MaxnEdge];
void spfa(int start){
    memset(visit, 0, sizeof(visit));
    memset(dis, 0x3f, sizeof(dis));
    queue<int>q;
    while (!q.empty())
        q.pop();
    q.push(start);
    visit[start] = 1;
    dis[start] = 0;
    while (!q.empty()){
        int now = q.front();
        q.pop();
        visit[now] = 0;
        for (int i = first[now]; i != -1; i = Next[i]){
            if (dis[v[i]] > dis[now] + w[i]){
                dis[v[i]] = dis[now] + w[i];
                if (!visit[v[i]]){
                    q.push(v[i]);
                    visit[v[i]] = 1;
                }
            }
        }
    }
}
int main(){
    while (scanf("%d%d%d", &n, &m, &s)!= EOF){
        memset(first, -1, sizeof(first));
        memset(Next, -1, sizeof(first));
        for (int i = 0; i < m; i++){
            scanf("%d%d%d", &u[i], &v[i], &w[i]);
            Next[i] = first[u[i]];
            first[u[i]] = i;
        }
        int ncase;
        scanf("%d", &ncase);
        for (int i = 0; i < ncase; i ++){
            int to;
            scanf("%d", &to);
            v[i + m] = to;
            w[i + m] = 0;
            Next[i + m] = first[0];
            first[0] = i + m;
        }
        spfa(0);
        if (dis[s] == INF){
            printf("-1\n");
        }
        else
            printf("%d\n", dis[s]);
        //for (int i = first[0]; i != -1; i = Next[i])
        //    printf("%d\%d\%d\n", u[i], v[i], w[i]);

    }
    return 0;
}


细心的读者大宝贝,你一定发现了一些猫腻,那就是:

1.MaxnEdge = 21010;这是因为总边数=题目输入边数+与0号位置相连的边数。

2.Next数组的首字母大写了,为什么不是next数组呢?【强迫症如我】

原因是CE了,可能next在HDU的编译器上是关键字好像:


改成Next就AC了,奇怪而又有趣是吧:


3.在初始化dis数组的时候,要初始化最大值,const int INF=0x7fffffff;并不是最好的选择;最好的选择是const int INF = 0x3f3f3f3f;还可以用memset初始化:memset(dis, 0x3f, sizeof(dis));

附一下memset初始化的大佬解释:巴啦啦能量×3----->点我呀,我是memset我很皮


好了,昨天发现数据结构的网课TMD第五周的作业提交截止时间过了,很难受,所以今天没有表情包。

不过今天还是得皮一下:

沿着你皮肤纹理,走过曲折手臂

目光所及,是你发际

让我陷入这黑色的沼泽

心甘情愿地赴死

在你的瞳孔里看到自己的眼睛

在你的呼吸里找到自己的气息

在你的眉宇间闪躲自己的思念

在你的身体里找到另一个自己

我爱你

从左心房到右心室

从心脏到喉咙

从血液到灵魂


2018年4月17日晚0:10

hdu2680(最短路spfa!此题有重大发现)

Problem Description One day , Kiki wants to visit one of her friends. As she is liable to carsick...
  • martinue
  • martinue
  • 2015-10-15 18:36:41
  • 543

【正一专栏】登贝莱,该不该来!

登贝莱,该不该来! 原创 2017-09-18 九天 九天时空 被认为史上夏季转会市场最被动操作的巴萨,尤其是在西班牙超级杯被皇马两回合双杀后,每个人都不看好巴萨的时候,巴萨在联赛中取...
  • fjssharpsword
  • fjssharpsword
  • 2017-09-19 08:14:16
  • 575

hdu 2680 Choose the best route (SPFA算法)

本题链接:点击打开链接 本题大意:         输入n,m,s,代表有n个点,m条边,s代表终点。然后输入边,每条边输入p,q,t;p,q代表两个点,t表示边权,注意题目中说是从p指向q边,故...
  • LSGBB
  • LSGBB
  • 2015-08-20 08:46:13
  • 381

关于女人强势表现和强势心理

经常听大家谈论女人的强势,很多男人说不喜欢强势的女人,今天这个朋友又提出了强势心理。我想先确认一下,大家说的强势是什么?因为如果不能够明确的定义,是很难回答这个问题的。我先说说我的理解是否正确,然后我...
  • csshuke
  • csshuke
  • 2015-12-08 18:20:46
  • 670

Unix传奇(下篇)----RMS让世界上所有的人都知道,入侵电脑系统只是低级不入流的黑客干的事.....

3ks:http://coolshell.cn/?p=2324Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴 》、《Unix 40年:昨天,今天和...
  • zhangqi187
  • zhangqi187
  • 2010-08-17 22:25:00
  • 761

看了这份盘点文章,才明白只会写程序的码农,为何越来越掉价

这是一份迟来的技术盘点文章,因为我们无法定义 2017 年到底是个怎样的一年,可以说是人工智能爆发的一年?还是说虚拟币疯狂的一年?或者是云计算大数据最繁盛的一年? 每个媒体都再拼命盘点,都在疯狂比较。...
  • kwame211
  • kwame211
  • 2018-01-15 09:29:41
  • 436

HDU 2680:Choose the best route【Dijkstra & SPFA】

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot...
  • lin14543
  • lin14543
  • 2015-08-17 16:45:17
  • 616

当很多人都不看好你的时候,你要看好自己!

今晚乒乓球赛,很多人都不看好我,最后我赢了,而且我确实是一直看好自己、相信自己的。别人是别人,我是我,别人肯定没有我了解我。看好自己,其实不需要什么理由!...
  • stpeace
  • stpeace
  • 2013-12-07 00:41:39
  • 3882

hdu2680—Choose the best route(spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/100...
  • jiangzhiyuan123
  • jiangzhiyuan123
  • 2017-05-25 20:12:36
  • 180

项目经理的生存之道强势or弱势

项目经理的生存之道强势or弱势 作者:张子良   本不想写这个专题,但是却被一些东西触发,有了不吐不快的冲动,项目经理的工作方式、管理技巧种种抛开不谈,本文只从项目经理工作中面临各种压力、问题时采...
  • zhangziliang09
  • zhangziliang09
  • 2018-02-07 17:51:39
  • 21
收藏助手
不良信息举报
您举报文章:不被世界看好的SPFA依旧强势-HDU2680
举报原因:
原因补充:

(最多只允许输入30个字)