title: ‘算法训练-最短路(BF)’date: 2020-03-06 16:17:33
tags: [蓝桥杯]
published: true
hideInList: false
feature:
isTop: false

  1. /*
  2. 试题 算法训练 最短路
  3. 资源限制
  4. 时间限制:1.0s 内存限制:256.0MB
  5. 问题描述
  6. 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。
  7. 请你计算从1号点到其他点的最短路(顶点从1到n编号)。
  8. 输入格式
  9. 第一行两个整数n, m。
  10. 接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。
  11. 输出格式
  12. 共n-1行,第i行表示1号点到i+1号点的最短路。
  13. 样例输入
  14. 3 3
  15. 1 2 -1
  16. 2 3 -1
  17. 3 1 2
  18. 样例输出
  19. -1
  20. -2
  21. 数据规模与约定
  22. 对于10%的数据,n = 2,m = 2。
  23. 对于30%的数据,n <= 5,m <= 10。
  24. 对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,
  25. -10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。
  26. */
  27. #include<cstdio>
  28. #include<vector>
  29. using namespace std;
  30. struct Node{
  31. int v;
  32. int dis;
  33. Node(int _v,int _dis){
  34. v = _v;
  35. dis = _dis;
  36. }
  37. };
  38. vector<Node> Adj[20001];
  39. #define maxL (1 << 30)
  40. int main(){
  41. int n, m;
  42. scanf("%d%d", &n, &m);
  43. for (int i = 1; i <= m; i++){
  44. int u, v, l;
  45. scanf("%d%d%d", &u, &v, &l);
  46. Node node = Node(v, l);
  47. Adj[u].push_back(node);
  48. }
  49. int d[20001];
  50. fill(d, d + 20001, maxL);
  51. d[1] = 0;
  52. bool update;
  53. while (true){
  54. update = false;
  55. for (int i = 1; i <= n; i++){
  56. for (int j = 0; j < Adj[i].size(); j++){
  57. int v = Adj[i][j].v;
  58. int dis = Adj[i][j].dis;
  59. if (d[i] + dis < d[v]){
  60. d[v] = d[i] + dis;
  61. update = true;
  62. }
  63. }
  64. }
  65. if(!update){
  66. break;
  67. }
  68. }
  69. for (int i = 2; i <= n; i++){
  70. printf("%d\n", d[i]);
  71. }
  72. }