SPFA判负环

其实也没什么好说的

反正两种判断方式

要么路径长超过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!"<<'\n';
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(dis[i]==707406378){
			cout<<"NoPath"<<'\n';
		}
		else cout<<dis[i]<<'\n';
	}
	return 0;
}
posted @ 2018-10-23 21:08  Stargazer_cykoi  阅读(88)  评论(0编辑  收藏  举报