蓝桥杯训练 最短路 (SPFA模板 vector)

算法训练 最短路

时间限制:1.0s   内存限制:256.0MB

问题描述

给定一个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,保证从任意顶点都能到达其他所有顶点。

题目链接:http://lx.lanqiao.org/problem.page?gpid=T15

题目分析:再记一下SPFA的vector版的板子

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int const MAX = 200005;
int const INF = 1 << 30;
int n, m;

struct EDGE
{
    int u, v;
    int val;
}e[MAX << 2];

struct NODE
{
    int v, w;
    NODE(int vv, int ww)
    {
        v = vv;
        w = ww;
    }
};

vector <NODE> vt[MAX];
int dis[MAX];
bool vis[MAX];

void SPFA(int v0)
{
    memset(vis, false, sizeof(vis));
    for(int i = 1; i <= n; i++)
        dis[i] = INF;
    dis[v0] = 0;
    queue <int> q;
    q.push(v0);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        vis[u] = false;
        int sz = vt[u].size();
        for(int i = 0; i < sz; i++)
        {
            int v = vt[u][i].v;
            int w = vt[u][i].w;
            if(dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                if(!vis[v])
                {
                    q.push(v);
                    vis[v] = true;
                }
            }
        }
    }
}

int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++)
        scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].val);
    for(int i = 0; i < m; i++)
        vt[e[i].u].push_back(NODE(e[i].v, e[i].val));
    SPFA(1);
    for(int i = 2; i <= n; i++)
        printf("%d\n", dis[i]);
}
时间: 2024-08-15 04:47:18

蓝桥杯训练 最短路 (SPFA模板 vector)的相关文章

蓝桥杯训练 安慰奶牛 (Kruskal MST)

算法训练 安慰奶牛 时间限制:1.0s   内存限制:256.0MB 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间.

蓝桥杯训练 字串统计 (暴力+substr)

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

蓝桥杯训练中的考新郎问题

题目内容: 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目, 叫做"考新郎",具体的操作是这样的:首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后, 让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓 衣板.. 假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 输入描述 N M 输出描述 可能的种数 输入样例 3

蓝桥杯训练之ACM

题目内容: 现有长度为n 的字符串,该字符串只由"A","C","M"三种字符组成(可以只有其中一种或两种字符, 但绝对不能有其他字符 ),但是禁止在串中出现C 相邻的情况,求一共有多少种满足要求的不同的字符串. 例如:n=2 时,有AA,AC,AM,CA,CM,MA,MC,MM 8 种情况. 输入描述 长度整数n(n<40) 输出描述 字符串的种数 输入样例 2 输出样例 8 #include<stdio.h> #includ

蓝桥杯训练 2n皇后

问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后.输出格式 输出一个整数,表示总共有多少种放法.样例输入41 1 1 11 1

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

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

蓝桥杯 最短路 道路和航路 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行

蓝桥杯 算法训练 最短路

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

蓝桥杯 算法训练 最短路 [ 最短路 bellman ]

传送门 算法训练 最短路 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定一个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 数据规