SPFA算法为什么加上优化就出问题呢?
查看原帖
SPFA算法为什么加上优化就出问题呢?
682146
Hzj201014楼主2024/5/1 21:10
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T,n,m,t,u,v,w,cnt;
int first[2005],dis[2005],visit[2005];
int tong[2005];
struct node{
	int to,w,next;
}edge[8005];
inline void add(int u,int v,int w){
	edge[++cnt].to = v;
	edge[cnt].w = w;
	edge[cnt].next = first[u];
	first[u] = cnt;
}
deque<int> que;
inline void SPFA(){
	memset(visit,0,sizeof(visit));
	memset(first,0,sizeof(first));
	memset(tong,0,sizeof(tong));
	cnt = 0;
	while(!que.empty()){
		que.pop_front();
	}
	cin>>n>>m;
	while(m--){
		cin>>u>>v>>w;
		if(w < 0){
			add(u,v,w);
		}else{
			add(u,v,w);
			add(v,u,w);
		}
	}
	for(int i = 1;i <= n;i++){
		dis[i] = INT_MAX;
	}
	que.push_front(1);
	dis[1] = 0;
	visit[1] = 1;
	while(!que.empty()){
		int x = que.front();
		que.pop_front();
		visit[x] = 0;
		for(int i = first[x];i;i = edge[i].next){
			int y = edge[i].to;
			if(dis[y] > dis[x] + edge[i].w){
				dis[y] = dis[x] + edge[i].w;
				if(visit[y] == 0){
					visit[y] = 1;
					if(!que.empty() && dis[y] < dis[que.front()]){
						que.push_front(y);
					}else{
						que.push_back(y);
					}
					tong[y]++;
					if(tong[y] >= n){
						cout<<"YES\n";
						return ;
					}
				}
			}
		}
	}
	cout<<"NO\n";
	return ;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--){
		SPFA();
	}
	return 0;
}
(#9WA)

SPFA这道题为什么加上优化后就错了,不加优化就没问题呢?????

2024/5/1 21:10
加载中...