P3385负环求调90pts WAon#12,样例未过,悬赏关注
查看原帖
P3385负环求调90pts WAon#12,样例未过,悬赏关注
607952
ZHANGGUIZHI楼主2023/10/5 20:16
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
int tot,head[20002],ver[100002],nex[100002],edge[100002];
void add(int x,int y,int z){
  nex[++tot]=head[x];
  ver[tot]=y;
  edge[tot]=z;
  head[x]=tot;
}
int cnt[20002],dis[20002];
bool vis[20002];
queue<int> q;
bool spfa(){
  memset(dis,0x3f,sizeof dis);
  memset(cnt,0,sizeof cnt);
  memset(vis,0,sizeof vis);
  while(!q.empty())q.pop();
  q.push(1),dis[1]=0,vis[1]=1,cnt[1]=1;
  while(!q.empty()){
    int x=q.front();
    q.pop(),vis[x]=0;
    for(int i=head[x];i;i=nex[i]){
      int y=ver[i],z=edge[i];
      if(dis[x]+z<dis[y]){
	dis[y]=dis[x]+z;
	cnt[y]=cnt[x]+1;
	if(cnt[y]>=n)
	  return 0;
	if(!vis[y]){
	  vis[y]=1;
	  q.push(y);
	}
      }
    }
  }
  return 1;
}
signed main(){
  cin>>t;
  while(t--){
    cin>>n>>m;
    memset(head,0,sizeof head),tot=0;
    memset(ver,0,sizeof ver);
    memset(nex,0,sizeof nex);
    memset(edge,0,sizeof edge);
    for(int i=1,u,v,w;i<=m;i++){
      cin>>u>>v>>w;
      add(u,v,w);
      if(w>=0)add(v,u,w);
    }
    if(!spfa())cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
  }
  return 0;
}

2023/10/5 20:16
加载中...