D - Silver Cow Party——最短路_spfa()算法

怼烎@ 2022-06-12 05:54 242阅读 0赞

Think:
1知识点:最短路_spfa()算法
2反思:图的初始化
3思路:通过正向边spfa()求出回去的,反向边spfa()求出到达的

建议参考题意分析

vjudge题目链接

以下为Accepted代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. const int inf = 0x3f3f3f3f;
  7. const int N = 1e3 + 4;
  8. int n, e1[N][N], e2[N][N], dis[N], vis[N];
  9. void spfa(int x, int e[N][N]);
  10. int main(){
  11. int m, i, x, u, v, w, sum[N], mav;
  12. scanf("%d %d %d", &n, &m, &x);
  13. mav = 0;
  14. memset(sum, 0, sizeof(sum));
  15. memset(e1, inf, sizeof(e1));
  16. memset(e2, inf, sizeof(e2));
  17. for(i = 0; i < m; i++){
  18. scanf("%d %d %d", &u, &v, &w);
  19. e1[u][v] = w;
  20. e2[v][u] = w;
  21. }
  22. spfa(x, e1);
  23. for(i = 1; i <= n; i++)
  24. sum[i] += dis[i];
  25. spfa(x, e2);
  26. for(i = 1; i <= n; i++){
  27. mav = max(mav, sum[i]+dis[i]);
  28. }
  29. printf("%d\n", mav);
  30. return 0;
  31. }
  32. void spfa(int x, int e[N][N]){
  33. queue <int> q;
  34. memset(dis, inf, sizeof(dis));
  35. memset(vis, 0, sizeof(vis));
  36. dis[x] = 0, vis[x] = 1;
  37. q.push(x);
  38. while(!q.empty()){
  39. int t1 = q.front();
  40. q.pop();
  41. vis[t1] = 0;
  42. for(int i = 1; i <= n; i++){
  43. if(dis[t1] + e[t1][i] < dis[i]){
  44. dis[i] = dis[t1] + e[t1][i];
  45. if(!vis[i]){
  46. q.push(i);
  47. vis[i] = 1;
  48. }
  49. }
  50. }
  51. }
  52. }

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读