洛谷 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;
}

相关推荐

  1. P3008 [USACO11JAN] Roads and Planes G

    2024-07-11 13:58:05       23 阅读
  2. P2176 [USACO11DEC] RoadBlock S / [USACO14FEB]Roadblock G/S

    2024-07-11 13:58:05       27 阅读
  3. 题解】 P1696 [USACO18JAN] Blocked Billboard II B

    2024-07-11 13:58:05       27 阅读
  4. 【题解】 P9183 [USACO23OPEN] FEB B

    2024-07-11 13:58:05       56 阅读
  5. P2957 [USACO09OCT] Barn Echoes G

    2024-07-11 13:58:05       57 阅读
  6. P2895 [USACO08FEB] Meteor Shower S

    2024-07-11 13:58:05       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 13:58:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 13:58:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 13:58:05       58 阅读
  4. Python语言-面向对象

    2024-07-11 13:58:05       69 阅读

热门阅读

  1. 2.Spring的IOC容器里面加入对象的常见方式

    2024-07-11 13:58:05       25 阅读
  2. React基础学习-Day02

    2024-07-11 13:58:05       20 阅读
  3. MyClass.static_method() 加不加括号有什么区别

    2024-07-11 13:58:05       24 阅读
  4. AcWing 1633:外观数列

    2024-07-11 13:58:05       26 阅读
  5. nginx的重定向

    2024-07-11 13:58:05       24 阅读
  6. SpringBoot整合Easy-Es最佳实践

    2024-07-11 13:58:05       21 阅读
  7. SpringBoot防止重复提交 AOP+自定义注解+redis

    2024-07-11 13:58:05       23 阅读