差分约束10分求调
查看原帖
差分约束10分求调
448884
快乐的大童楼主2022/7/24 20:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e3+5;
int n,m;
struct edge {
	int to,nxt,w;
} a[N];
int head[N],tmp;
bool f=1;
void add(int x,int y,int z) {
	tmp++;
	a[tmp].to=y;
	a[tmp].w=z;
	a[tmp].nxt=head[x];
	head[x]=tmp;
}
bool vis[N];
int cnt[N],dis[N];
void spfa() {
	for(int i=1;i<=n+1;i++) dis[i]=0x7fffffffffffffff,vis[i]=0,cnt[i]=0;
	queue<int>q;
	q.push(n+1);
	vis[n+1]=1,dis[n+1]=0,cnt[n+1]++;
	while(!q.empty()) {
		int now=q.front();
		q.pop();
		vis[now]=0;
		for(int i=head[now]; i; i=a[i].nxt) {
			int u=a[i].to;
			if(dis[u]>dis[now]+a[i].w) {
				dis[u]=dis[now]+a[i].w;
				if(!vis[u]) {
					vis[u]=1;
					q.push(u);
					cnt[u]++;
					if(cnt[u]>=n+1) {
						puts("NO");
						exit(0);
					}
				}
			}
		}
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1,x,y,z; i<=m; i++) {
		cin>>x>>y>>z;
		add(y,x,z);
	}
	for(int i=1; i<=n; i++) add(n+1,i,0);
	spfa();
	for(int i=1; i<=n; i++)
		cout<<dis[i]<<' ';
}

2022/7/24 20:12
加载中...