SPFA20代码求助,下载数据后和答案一样
查看原帖
SPFA20代码求助,下载数据后和答案一样
615870
weibowei楼主2023/5/23 13:37
using namespace std;
int T;
int n,m;
const int N=2e3+500;
struct Edge {
	int to,w;
};
vector<Edge> a[N];
queue <int> q;
int dis[N],vis[N],s[N];
int spfa(int tot) {
	memset(dis,0x3f3f3f3f,sizeof dis);
	memset(vis,0,sizeof vis);
	memset(s,0,sizeof s);
	
	dis[1]=0; vis[1]=1;
	
	while(!q.empty()) q.pop();
	q.push(1);
	while(!q.empty()) {
		int temp=q.front();	q.pop();	vis[temp]=0;
		for(int i=0;i<a[temp].size();i++) {
			int to=a[temp][i].to,w=a[temp][i].w;
			if(dis[to]>dis[temp]+w){
				dis[to]=dis[temp]+w;
				if(!vis[to]) {
					if(++s[to]>=tot) return 1;
					vis[to]=1;
					q.push(to);
				}
			}
		}
	}
	return 0;
}
int main() {
	cin>>T;
	while(T--) {
		for(int i=1;i<=N;i++) {
			vector<Edge>().swap(a[i]);
		}
		cin>>n>>m;
		for(int i=1;i<=m;i++) {
			int x,y,w;
			cin>>x>>y>>w;
			Edge t1;  t1.to=y;  t1.w=w;
			a[x].push_back(t1);
			if(w>=0) {
				Edge t2; t2.to=x; t2.w=w; 
				a[y].push_back(t2);
			} 
		}				
		if(spfa(n)==1) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}		
	return 0;
}```
2023/5/23 13:37
加载中...