spfa差分约束27分求助
查看原帖
spfa差分约束27分求助
579489
Vigilant_Yaksha楼主2023/2/2 11:35
#include<bits/stdc++.h>
#define maxn 10000010
using namespace std;
const int inf=11451419;
int n,m,cnt1;
int cnt[maxn],num[maxn],dis[maxn],nex[maxn],to[maxn],head[maxn];
bool vis[maxn];
void add(int x,int y,int z){
	to[++cnt1]=y;
	nex[cnt1]=head[x];																													
	head[x]=cnt1;
	num[cnt1]=z;
}
queue<int >q;
bool spfa(){
	q.push(0);
	num[0]=0;
	vis[0]=1;
	cnt[0]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=nex[i]){
			int v=to[i];
			if(num[v]>=(long long )num[u]+dis[i]){
				num[v]=num[u]+dis[i];
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
					cnt[v]++;
					if(cnt[v]>n+114514)return 1;
				}
			}
		}
	}
	return 0;
} 
int main(){
    cin>>n>>m; 
	for(int i=1;i<=n;i++){
		num[i]=inf;
	}
    for(int i=1;i<=m;i++){
    	int u,v,w;
    	cin>>u>>v>>w;
    	add(v,u,w);
	}
	for(int i=1;i<=n;i++)
		add(0,i,0);
	
	if(!spfa()){
		for(int i=1;i<=n;i++)
			cout<<num[i]<<" ";
	}
	else cout<<"NO";
    return 0;
}
2023/2/2 11:35
加载中...