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 }