spfa板子感觉很对为啥只有二十分
查看原帖
spfa板子感觉很对为啥只有二十分
137723
pencil楼主2021/8/14 15:00
#include<bits/stdc++.h>
using namespace std;
int next[8101],h[8010],z[8010],w[8010],idx=0;
void add(int a,int b,int c){
	next[++idx]=h[a];
	h[a]=idx;
	z[idx]=b;
	w[idx]=c;
}
queue<int> p;
int main(){
	int n,m,t,i,j[4010],d[4010];bool flag=1,vis[6000];
	cin>>t;
	for(i=1;i<=t;i++){
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			if(w>0){
				add(u,v,w);add(v,u,w);
			}else{
				if(w<0)
				add(u,v,w);
			}
		}
		p.push(1);
		flag=1;
		memset(j,0,sizeof(j));memset(d,0x3f,sizeof(d));memset(h,0,sizeof(h));memset(vis,0,sizeof(vis));
		d[1]=0;
		while(!p.empty()){
			int o=p.front();
			p.pop();vis[o]=0;
			for(int u=h[o];u;u=next[u]){
				int b=z[u];
				
				if(d[b]>d[o]+w[u]){
//					j[b]=j[o]+1;
					d[b]=d[o]+w[u];
					if(!vis[b]){
						j[b]++;
					if(j[b]>n){
						cout<<"YES"<<endl;
						flag=0;
						break;
					}p.push(b);
					}
					
				}
			}
			if(!flag) break;
		}
		if(flag) cout<<"NO"; 
		idx=0;
	} 
	return 0;
}
2021/8/14 15:00
加载中...