其实也没什么好说的
反正两种判断方式
要么路径长超过n,要么一个点入队次数大于n
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,adj[1005],nxt[100005],fuc[1005][1005],to[100005],str,val[100005],dis[1005],num[1005];
bool vis[1005];
inline int read(){
char ch=getchar();
int res=0,f=1;
while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
return res*f;
}
inline void addedge(int u ,int v,int w){
nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v,val[cnt]=w;
}
inline bool spfa(int s){
memset(dis,127/3,sizeof(dis));
memset(vis,false,sizeof(vis));
memset(num,0,sizeof(num));
queue<int> q;
q.push(s),vis[s]=true,dis[s]=0,num[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();vis[u]=false;
for(int e=adj[u];e;e=nxt[e]){
int v=to[e];
if(dis[u]+val[e]<dis[v]){
num[v]=num[u]+1;
if(num[v]>=n) return false;
dis[v]=dis[u]+val[e];
if(!vis[v]){
q.push(v);
vis[v]=true;
}
}
}
}
return true;
}
int main(){
n=read(),m=read(),str=read();
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
addedge(u,v,w);
}
if(spfa(str)==false){
cout<<"Zerg!"<<'
';
return 0;
}
for(int i=1;i<=n;i++){
if(dis[i]==707406378){
cout<<"NoPath"<<'
';
}
else cout<<dis[i]<<'
';
}
return 0;
}