求调
查看原帖
求调
655798
lflby楼主2024/11/28 20:30

28pts

#include <bits/stdc++.h>
#define int long long
using namespace std;
int read()
{
	int res = 0,f = 1;
	char ch = getchar();
	while (ch<'0'||ch>'9') f = (ch=='-'?-1:1),ch = getchar();
	while (ch>='0'&&ch<='9') res = (res<<3)+(res<<1)+(ch^48),ch = getchar();
	return res*f;
}
void write(int x)
{
	if (x<0) putchar('-'),x = -x;
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
void writech(int x,char ch){write(x),putchar(ch);}
const int N = 5e3+5;
int n,m;
int e[N],w[N],ne[N],h[N];
int idx;
int dist[N];
bool vis[N];
int cnt[N];
void add(int x,int y,int z)
{
	e[idx]=y;
	w[idx]=z;
	ne[idx]=h[x];
	h[x]=idx++;
}
bool spfa(int s)
{
	for (int i = 1; i < N; i++) dist[i]=2e9;
	memset(vis,false,sizeof(vis));
	memset(cnt,0,sizeof(cnt));
	queue<int>q;
	q.push(s);
	dist[s]=0;
	vis[s]=true;
	while (q.size())
	{
		int u = q.front();
		q.pop();
		vis[u]=false;
		for (int i = h[u]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (dist[j]>dist[u]+w[i])
			{
				dist[j]=dist[u]+w[i];
				cnt[j]=cnt[u]+1;
				if (cnt[j]>=n+1) return true;
				if (!vis[j])
				{
					vis[j]=true;
					q.push(j);
				}
			}
		}
	}
	return false;
}
signed main()
{
	n=read(),m=read();
	memset(h,-1,sizeof(h));
	for (int i = 1; i <= m; i++)
	{
		int x=read(),y=read(),z=read();
		add(y,x,z);
	}
	for (int i = 1; i <= n; i++) add(0,i,0);
	if (spfa(0)) puts("NO");
	else for (int i = 1; i <= n; i++) writech(dist[i],' ');
	return 0;
}
2024/11/28 20:30
加载中...