1、spfa+SLF+LLL优化

 1 bool spfa()
 2 {//寻找s到t的最短路,dis数组记录点i到s的距离,vis数组表示是否被访问,cnt数组判环
 3     for (int i = 1; i <= n; i++) dis[i] = INF, vis[i] = false;
 4     dis[s] = 0, vis[s] = true;
 5     deque<int>q;
 6     q.push_back(s);
 7     int tot = 1;
 8     long long sum = dis[s];
 9     while (!q.empty())
10     {
11         int u = q.front();
12         while (1ll*dis[u] * tot > sum)
13         {
14             q.pop_front();
15             q.push_back(u);
16             u = q.front();
17         }
18         q.pop_front();
19         vis[u] = false;
20         tot--;
21         sum -= dis[u];
22         if (u == t)continue;
23         for (int i = Head[u]; i != -1; i = edge[i].next)
24         {
25             int v = edge[i].to, w = edge[i].w;
26             if (dis[u] + w < dis[v])
27             {
28                 dis[v] = dis[u] + w;
29                 if (!vis[v])
30                 {
31                     vis[v] = true;
32                     if (!q.empty())
33                     {
34                         int tmp = q.front();
35                         if (dis[v] < dis[tmp]) q.push_front(v);
36                         else q.push_back(v);
37                     }
38                     else q.push_back(v);
39                     tot++;
40                     sum += dis[v];
41                     cnt[v]++;
42                     if (cnt[v] > n) return false;
43                 }
44             }
45         }
46     }
47     return true;
48 }
View Code

相关文章:

  • 2021-08-07
  • 2022-02-27
  • 2022-12-23
  • 2021-11-22
  • 2021-05-17
  • 2021-11-19
  • 2022-02-26
  • 2021-10-20
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案