蓝桥杯 最短路 spfa

问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式

共n-1行,第i行表示1号点到i+1号点的最短路。

样例输入

3 3
1 2 -1
2 3 -1
3 1 2

样例输出

-1
-2

数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

题解: 前向星 存图 SPFA

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<map>
 5 #include<queue>
 6 using namespace std;
 7 struct node
 8 {
 9     int next;
10     int to;
11     int we;
12 } edge[200005];
13 int nedge=0;
14 int pre[20005],vis[20005],d[20005];
15 int n,m;
16 int aa,bb,cc;
17 int now;
18 queue<int>q;
19 void  add (int a,int b ,int c)
20 {
21     nedge++;
22     edge[nedge].to=b;
23     edge[nedge].we=c;
24     edge[nedge].next=pre[a];
25     pre[a]=nedge;
26 }
27 void spfa()
28 {
29     for(int i=1;i<=n;i++)
30     {
31         vis[i]=0;
32         d[i]=0xfffffff;
33     }
34     q.push(1);
35     vis[1]=1;
36     d[1]=0;
37     while(!q.empty())
38     {
39         now=q.front();
40         q.pop();
41         vis[now]=0;
42         for(int i=pre[now];i!=0;i=edge[i].next)
43         {
44             int mm=edge[i].to;
45             if(d[now]+edge[i].we<d[mm])
46             {
47                 d[mm]=d[now]+edge[i].we;
48                 if(!vis[mm])
49                 {
50                     vis[mm]=1;
51                     q.push(mm);
52                 }
53             }
54         }
55     }
56 }
57 int main()
58 {
59     scanf("%d %d",&n,&m);
60      for(int i=1;i<=n;i++)
61     {
62          pre[i]=0;
63     }
64     memset(edge,0,sizeof(edge));
65     for(int i=1;i<=m;i++)
66     {
67         scanf("%d %d %d",&aa,&bb,&cc);
68         add(aa,bb,cc);
69     }
70     spfa();
71     for(int i=2;i<=n;i++)
72         printf("%d\n",d[i]);
73     return 0;
74 }

时间: 2024-11-13 20:19:58

蓝桥杯 最短路 spfa的相关文章

蓝桥杯 最短路 道路和航路 SPFA算法

1.SPFA算法 算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 锦囊1 使用最短路算法. 锦囊2 使用Dijkstra算法,此图的边数比点数的平方要少很多,因此应该使用带堆优化的Dijkstra. 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出格式 共n-1行,第i行

蓝桥杯-最短路 (SPFA算法学习)

SPFA算法主要用来解决存在负边权的单源最短路情况(但不能有负环!!!)一个简单的方法判断是否有没有负环可以通过判断是否有一个节点是否频繁进出队列. 以下内容转自https://blog.csdn.net/xunalove/article/details/70045815 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名字我们就可以看出,这种算法在效率上一定有过人之处. 很多时候,给定的

蓝桥杯 最短路

题目描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边. 输出 输出格式 共n-1行,第i行表示1号点到i+1号点的最短路. 样例输入 3 3 1 2 -1 2 3 -1 3 1 2 样例输出 -1 -2 提示 数据规模与约定 对于10%的数据,n = 2,m = 2. 对于30%的数据,

第五届蓝桥杯C++本科A组

今天上午参加了第五届蓝桥杯比赛,还是去年的地方,还是去年的考场,不同的是经过了一年的历练,多了一份坦然与自信.不管最后结果如何,是对自己一年学习的一个小小的交代.ACMER IN HHUC, we never say no. 结果填空 1. a*a+b*b+c*c=1000;a,b,c均为整数,求一组解中的最小值.暴力的题目,很容易就想到了0,10,30.所以没多想就填上了0,可是考完发现还可以是负数...悲了个剧了,三分就这么水没了.. 2. 类似于往年的一道高斯的生日,求距离某一天(yyyy

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

2018 蓝桥杯省赛 B 组模拟赛(一)

2018 蓝桥杯省赛 B 组模拟赛(一) A.今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵逼,就知道大家也不知道蒜头君的年龄,便连忙补充道:“我的年龄是蒜头君个位数和十位数之和的三倍”. 请你计算:蒜头君和花椰妹年龄一共有多少种可能情况? 提醒:两位的年龄都是在 [10,100)[10,100) 这个区间内. 题解: 暴力枚举 answer: 1 代码如下: #

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共