只A了两个点,求助
查看原帖
只A了两个点,求助
754444
tamamocross楼主2023/6/21 11:13
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
const int Max=3e3+1;
queue<int> q;
int head[Max*2],edge[Max*2],ver[Max*2],Next[Max*2],tot,vis[Max*2];
int dis[Max*2],v[Max*2];
void add(int a,int b,int c){
	edge[++tot]=c;ver[tot]=b;
	Next[tot]=head[a];head[a]=tot;
	if(c>=0){
		edge[++tot]=c;ver[tot]=a;
		Next[tot]=head[b];head[b]=tot;
	}
}
bool spfa(int n){
	while(!q.empty()){
		q.pop();
	}
	q.push(1);
	v[1]=1;
	dis[1]=0;
	while(q.size()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=Next[i]){
			int y=ver[i];
			//cout<<x<<" "<<y<<" ";
			if(edge[i]+dis[x]<dis[y]){
				dis[y]=dis[x]+edge[i];	
				vis[y]=vis[x]+1;
				//cout<<dis[x]
				if(vis[y]>=n){
					return false;
				}
				if(!v[y]){
					q.push(y);
					v[y]=1;
				}
			}
		}
	}
	return true;
}
void check(int n){
	for(int i=1;i<=n;i++){
		cout<<dis[i]<<" ";
	}
	for(int i=1;i<=n;i++){
		cout<<vis[i]<<" ";
	}
}
int main(){
//	freopen("P3385_1.in","r",stdin);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int n,m;
		cin>>n>>m;
		tot=0;
		memset(head,0,sizeof(head));
		memset(dis,0x3f,sizeof(dis));
		memset(ver,0,sizeof(ver));
		memset(edge,0,sizeof(edge));
		memset(Next,0,sizeof(Next));
		memset(vis,0,sizeof(vis));
		memset(v,0,sizeof(v));
		for(int j=1;j<=m;j++){
			int a,b,c;
			cin>>a>>b>>c;
			add(a,b,c);
		}
		if(spfa(n)){
		//	check(n);
			cout<<"NO"<<endl;
		}else{
		//	check(n);
			cout<<"YES"<<endl;
		}
	}
} 
2023/6/21 11:13
加载中...