欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 洛谷 P3008 [USACO11JAN] Roads and Planes G

洛谷 P3008 [USACO11JAN] Roads and Planes G

2024/11/30 8:44:11 来源:https://blog.csdn.net/sblsf/article/details/140249160  浏览:    关键词:洛谷 P3008 [USACO11JAN] Roads and Planes G

题意

有一张 n n n ( m 1 + m 2 ) (m_1+m_2) (m1+m2) 边的无向图,其中 m 1 m_1 m1 条为无向边,另外 m 2 m_2 m2 条为有向边, 无向边的边权可以为负。求 s s s 到其他每个点的最短路。

思路

使用 SPFA 会 T 掉一两个点,但由于数据水,加个 SLF 优化就能过。
SLF 优化:把普通队列换成双端队列,然后每次插入时和队头比较,如果更优插到队头否则插队尾。

代码

// Problem: P3008 [USACO11JAN] Roads and Planes G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3008
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <iostream>
#include <vector>
#include <deque>
using namespace std;
#define int long long
const int INF = 1e18;
using PII = pair<int, int>;signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m1, m2, s;cin >> n >> m1 >> m2 >> s;s--;vector<vector<PII>> G(n);for(int i = 0, u, v, w; i < m1; i++){cin >> u >> v >> w;u--, v--;G[u].emplace_back(v, w);G[v].emplace_back(u, w);}for(int i = 0, u, v, w; i < m2; i++){cin >> u >> v >> w;u--, v--;G[u].emplace_back(v, w);}vector<int> dis(n, INF);vector<bool> vis(n, false);auto spfa = [&](int s){deque<int> q;dis[s] = 0;vis[s] = true;q.push_front(s);while(q.size()){int u = q.front();q.pop_front();vis[u] = false;for(auto &edge: G[u]){int v = edge.first, w = edge.second;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;if(!vis[v]){vis[v] = true;if(q.size() && dis[v] >= dis[q.front()]) q.push_back(v);else q.push_front(v);}}}}};spfa(s);for(auto &x: dis){if(x == INF) cout << "NO PATH" << endl;else cout << x << endl;}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com