板子洛谷上过去了,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;
}