蓝桥杯训练 最短路 (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 31 2 -12 3 -13 1 2

样例输出

-1-2

数据规模与约定

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

题目链接:?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]);}

漫过心际的孤独,早已蔚然成冰,而你是这个季节里最美的音符。

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

相关文章:

你感兴趣的文章:

标签云: