求调,两MLE,一WA,74分
查看原帖
求调,两MLE,一WA,74分
767748
__2009楼主2023/7/23 22:25
#include<queue>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e7+5;
const int INF=0x7f7f7f7f;
// const int INF=(1<<31)-1;
struct Edge{
    int to,nxt,t;
};
Edge edge[maxn];
int head[maxn],cnt=0;
void add(int u,int v,int w){
    edge[++cnt].to=v;
    edge[cnt].t=w;
    edge[cnt].nxt=head[u];
    head[u]=cnt;
}
int dis[maxn];
bool bellman_ford(int n,int s){
	dis[s]=0;
	bool fl=false;
	for(int i=1;i<=n;i++){
		for(int u=1;u<=n;u++){
			for(int j=head[u];j;j=edge[j].nxt){
				int v=edge[j].to,w=edge[j].t;
				if(w==INF)continue;
				if(dis[v]<=dis[u]+w)continue;
				dis[v]=dis[u]+w;
				fl=true;
			}
		}
		if(!fl)break;
	}
	return fl;
}
int vis[maxn];
bool spfa(int n,int s){
  queue<int>que;
	dis[s]=0,vis[s]=1;
	que.push(s);
	while(!que.empty()){
		int u=que.front();
		que.pop();
		if(vis[u]==n)return false;
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to,w=edge[i].t;
			if(w==INF)continue;
			if(dis[v]<=dis[u]+w)continue;
			dis[v]=dis[u]+w;
			vis[v]++;
			que.push(v);
		}
	}
	return true;
}
void init(){
  	memset(edge,0,sizeof(edge));
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	memset(head,0,sizeof(head));
	cnt=0;
}
int main(){
int t;
  cin>>t;
  while(t--){
    int n,m;
  	cin>>n>>m;
    init();
  	int a,b,c;
  	int i;
  	for(i=1;i<=n;i++)dis[i]=INF;
	  for(i=0;i<m;i++){
	  	cin>>a>>b>>c;
	  	add(a,b,c);
		if(c>=0){
			add(b,a,c);
		}
	  }
//  bellman_ford(n,1);
	  if(spfa(n,1))cout<<"NO\n";
		else cout<<"YES\n";
  }
	return 0;
}
2023/7/23 22:25
加载中...