洛谷P2009 跑步

url: https://www.luogu.com.cn/problem/P2009

tag:
图论,最短路

思路:
这道题因为读入的时候,会有不同权值的相同的边,要求是如果有重复的就保留最长的那个,这种情况下用邻接链表不是很好做,所以可以用邻接矩阵来存比较方便。然后就是数据范围比较小,k是小于等于100,刚好floyd算法可以过,所以就用floyd来求最短路。

代码:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int main()
  5. {
  6. int d[110][110];
  7. memset(d, 0x3f, sizeof d);
  8. int n, k;
  9. cin >> n >> k ;
  10. int c = 0;
  11. for (int i = 0; i < n; i ++)
  12. {
  13. int w;
  14. cin >> w;
  15. if (i == n - 1)
  16. {
  17. d[i][0] = d[0][i] = w;
  18. }
  19. else
  20. {
  21. d[i][i + 1] = d[i + 1][i] = w;
  22. }
  23. }
  24. for (int i = 0; i < k; i ++)
  25. {
  26. char a, b;
  27. int w;
  28. cin >> a >> b >> w;
  29. if (d[a - 'A'][b - 'A'] == 0x3f3f3f3f) d[a - 'A'][b - 'A'] = d[b - 'A'][a - 'A'] = w;
  30. else d[a - 'A'][b - 'A'] = d[b - 'A'][a - 'A'] = max(w, d[a - 'A'][b - 'A']);
  31. }
  32. for (int q = 0; q < n; q ++)
  33. for (int i = 0; i < n; i ++)
  34. for (int j = 0; j < n; j ++)
  35. d[i][j] = min(d[i][j], d[i][q] + d[q][j]);
  36. char s, t;
  37. cin >> s >> t;
  38. cout << d[s - 'A'][t - 'A'];
  39. return 0;
  40. }
添加新评论