负 环 TLE

板子洛谷上过去了,vj一直T

#include<bits/stdc++.h>
#define int long long
const int N=1e5;
using namespace std;
int cnt,head[N];
int n,m,c[N],U[N];
int in[N],ch[N];//入度和出度'
int vis[N],inq[N],suf[N],dis[N];
queue<int> q;
struct edge{
    int next,to,w;
}e[N];
void add_edge(int u,int v,int w){
    e[++cnt].to=v;
    e[cnt].w=w; 
    e[cnt].next=head[u];
    head[u]=cnt;
}
inline void spfa(int s){
	for(int i=1;i<=n;i++){
		dis[i]=1e18;
		inq[i]=0;
	}
	vis[s]=1,dis[s]=0;
	q.push(s);inq[s]=1;
	while(q.size()){
		int u=q.front();q.pop();
		inq[u]=0;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].to,w=e[i].w;
			if(dis[u]+w<dis[v]){
				dis[v]=dis[u]+w;
				suf[u]=v;
				if(!inq[v]){
					inq[v]=1;
					q.push(v);
					vis[v]++;
					if(vis[v]>n){//出现负环 
						cout<<"YES"<<endl;
						cout<<u<<" ";
						for(int i=suf[u];i!=u;i=suf[i]) cout<<i<<" "; 
						cout<<u<<" ";
						exit(0);
					} 
				}
			}
		}
	}
	cout<<"NO";
} 
signed main(){
	ios::sync_with_stdio(0);
    cin.tie(0) , cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        add_edge(x,y,z);
    }
    for(int i=1;i<=n;i++){
    	add_edge(0,i,0);
    	
	}
    spfa(0);
	
    return 0;
}