title: ‘算法训练-最短路(BF)’date: 2020-03-06 16:17:33
tags: [蓝桥杯]
published: true
hideInList: false
feature:
isTop: false
/*试题 算法训练 最短路资源限制时间限制: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,保证从任意顶点都能到达其他所有顶点。*/#include<cstdio>#include<vector>using namespace std;struct Node{ int v; int dis; Node(int _v,int _dis){ v = _v; dis = _dis; }};vector<Node> Adj[20001];#define maxL (1 << 30)int main(){ int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++){ int u, v, l; scanf("%d%d%d", &u, &v, &l); Node node = Node(v, l); Adj[u].push_back(node); } int d[20001]; fill(d, d + 20001, maxL); d[1] = 0; bool update; while (true){ update = false; for (int i = 1; i <= n; i++){ for (int j = 0; j < Adj[i].size(); j++){ int v = Adj[i][j].v; int dis = Adj[i][j].dis; if (d[i] + dis < d[v]){ d[v] = d[i] + dis; update = true; } } } if(!update){ break; } } for (int i = 2; i <= n; i++){ printf("%d\n", d[i]); }}