洛谷博客
差分约束
P5960 【模板】差分约束算法
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAXN 100005
int cnt, n, m;
int head[MAXN], num[MAXN];
struct node{
int to,next,w;
}map[MAXN];
void add(int u,int v,int w){
map[++cnt] = (node){v,head[u],w};
head[u] = cnt;
}
#include <queue>
#include <string.h>
int dis[MAXN],vis[MAXN];
bool SPFA(int s){
memset(dis,0x3f,sizeof(dis));
queue <int>que;
que.push(s);
vis[s] = 1;
dis[s] = 0;
while(!que.empty()){
int u = que.front();
vis[u] = 0;
que.pop();
for(int k=head[u];k;k=map[k].next){
int v = map[k].to;
int w = map[k].w;
if (dis[v] > dis[u]+w){
dis[v] = dis[u]+w;
if(num[v] > n) return 0;
if(!vis[v]){
que.push(v);
num[v]++;
vis[v] = 1;
}
}
}
}
return 1;
}
int main(void)
{
cin >> n >> m;
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(0)) cout << "NO";
else
{
for(int i=1;i<=n;i++){
cout << dis[i] << " ";
}
}
return 0;
}