差分约束裸题。
Debug超级久到怀疑人生,最后发现读入优化写错了系列。
//Twenty
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
typedef long long LL;
const int maxn=1005;
const int maxm=10005;
using namespace std;
int n,m,l,r,w;
namespace fastIO {
const int sz=1<<15|1;
char ch,buf[sz],*l,*r;
void gechar(char &c) {
if(l==r) r=(l=buf)+fread(buf,1,sz,stdin);
c = l==r?(char)EOF:*l++;
}
template<typename T> void read(T &x) {
int f=1; x=0; gechar(ch);
while(ch!='-'&&(ch<'0'||ch>'9')) gechar(ch);
if(ch=='-') f=-1,gechar(ch);
for(;ch>='0'&&ch<='9';gechar(ch)) x=x*10+ch-'0'; x=x*f;
}
}
int ecnt,fir[maxn],nxt[maxm],to[maxm],val[maxm],cnt[maxn];
void add(int u,int v,int w) {
nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
}
void init() {
fastIO::read(n);
fastIO::read(m);
for(int i=1;i<=n;i++)
add(0,i,0);
for(int i=1;i<=m;i++) {
fastIO::read(l);
fastIO::read(r);
fastIO::read(w);
add(l,r,w);
}
}
int vis[maxn],dis[maxn],fl;
queue<int>que;
int spfa(int s) {
memset(dis,127,sizeof(dis));
dis[s]=0;
que.push(s);
while(!que.empty()) {
int x=que.front();
que.pop();
vis[x]=0;
for(int i=fir[x];i;i=nxt[i]) {
if(dis[to[i]]>dis[x]+val[i]) {
dis[to[i]]=dis[x]+val[i];
if(!vis[to[i]]) {
vis[to[i]]=1;
++cnt[to[i]];
if(cnt[to[i]]==n) {
fl=1;
return 0;
}
que.push(to[i]);
}
}
}
}
}
void work() {
spfa(0);
if(fl) {
printf("NO SOLUTION\n");
return;
}
for(int i=1;i<=n;i++)
printf("%d\n",-dis[i]);
}
//#define DEBUG
int main()
{
#ifdef DEBUG
freopen("1.in","r",stdin);
#endif
init();
work();
return 0;
}