HDOJ 3790 最短路径问题 SPFA

本文深入探讨了SPFA(Shortest Path Faster Algorithm)算法在解决最短路径问题中的应用,详细介绍了算法流程,包括节点距离更新、路径成本计算及队列操作。通过具体实例,演示了如何避免重复边引入的错误,确保算法正确性和效率。同时,提供了完整的C++代码实现,展示了如何在实际编程中应用SPFA算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为没有对边判重,白白WA了好几次,注意输入时必须要对边判重

 

AC   187MS    8100K

 1 #include <queue>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <memory.h>
 5 using namespace std;
 6 
 7 const int maxn = 1001;
 8 const int INF = 0x3F3F3F3F;
 9 
10 int a, b, d, p, nNum, mNum;
11 int dist[maxn], px[maxn], QM[maxn];
12 int cost[maxn][maxn], g[maxn][maxn];
13 
14 void spfa(int sx, int tx)
15 {
16     int   xx;
17     queue <int> q;
18     
19     q.push(sx);
20     QM[sx]=1, dist[sx]=0, px[sx]=0;
21     
22     while (!q.empty())
23     {
24         xx = q.front();
25         q.pop();
26         QM[xx] = 0; /* Took Away */
27         
28         for (int i=1; i<=nNum; ++i)
29         {
30             if (dist[i] > dist[xx]+g[xx][i])
31             {
32                 dist[i] = dist[xx] + g[xx][i];
33                 px[i] = px[xx] + cost[xx][i];
34                 
35                 if (QM[i] == 0)
36                 {
37                     QM[i] = 1;
38                     q.push(i);
39                 }
40             }/* End of if */
41             else if (dist[i]==dist[xx]+g[xx][i]
42                     && px[i]>px[xx]+cost[xx][i])
43             {
44                 px[i] = px[xx] + cost[xx][i];
45             }
46         }/* End of For */
47     }/* End of While */
48     
49     printf("%d %d\n", dist[tx], px[tx]);
50 }/* spfa */
51 
52 int main()
53 {
54     while (~scanf("%d %d", &nNum, &mNum), nNum+mNum!=0)
55     {        
56         for (int i=1; i<=nNum; ++i)
57         {
58             QM[i] = 0;
59             px[i] = dist[i] = INF;
60             
61             for (int j=1; j<=nNum; ++j)
62                 g[i][j] = cost[i][j] = INF;
63         }/* End of For */
64         
65         for (int i=1; i<=mNum; ++i)
66         {
67             scanf("%d %d %d %d", &a, &b, &d, &p);
68             
69             if (d < g[a][b])  /* 判重 */ 
70             {
71                 g[a][b] = g[b][a] = d;
72                 cost[a][b] = cost[b][a] = p;
73             }    
74         }/* End of For */
75         
76         int sx, tx;
77         
78         scanf("%d %d", &sx, &tx);
79         spfa(sx, tx);
80     }/* End of While */
81     
82     return 0;
83 }

 

转载于:https://www.cnblogs.com/yewei/archive/2012/08/09/2440547.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值