社区讨论

SPFA求助

学术版参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo30u6dd
此快照首次捕获于
2023/10/23 22:57
2 年前
此快照最后确认于
2023/10/23 22:57
2 年前
查看原帖
P4779 请问构造数据是怎么卡SPFA的?
复杂度应该是O(nlogn)O(n\log n)alt xxx
CPP
#include<bits/stdc++.h>
using namespace std;
const long long inf = 2147483647,N = 100005,M = 500005;
int n,m,s,dis[N],vis[N];
vector<pair<int,int> >G[N];
void spfa() {
	queue<int>q;
	for (int i = 1;i <= n;i ++) {
		dis[i] = inf;
		vis[i] = 0;
	}
	q.push(s);
	dis[s] = 0;
	vis[s] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for (unsigned i = 0;i < G[u].size();i ++) {
			int v = G[u][i].first;
			if (dis[v] > dis[u] + G[u][i].second) {
				dis[v] = dis[u] + G[u][i].second;
				if (vis[v] == 0) {
					vis[v] = 1;
					q.push(v);
				}
			}
		}
	}
}
int main(){
	cin >> n >> m >> s;
	for (int i = 1;i <= m;i ++) {
		int u,v,w;
		cin >> u >> v >> w;
		G[u].push_back(make_pair(v,w));
	}
	spfa();
	for (int i = 1;i <= n;i ++) {
		if (s == i) cout << 0 << " ";
		else cout << dis[i] << " ";
	}
	return 0;
} 

回复

5 条回复,欢迎继续交流。

正在加载回复...