#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e3 + 5;
const int inf = 0x3f3f3f3f;
int dis[maxn], total[maxn], n, m;
bool vis[maxn];
struct edge{
int to, w, next;
}e[maxn * 2];
int h[maxn], tot;
void add(int u, int v, int w)
{
e[tot].to = v;
e[tot].w = w;
e[tot].next = h[u];
h[u] = tot++;
}
bool spfa(int k)
{
memset(dis, 63, sizeof(dis));
dis[k] = 0;
vis[k] = true;
queue<int> q;
q.push(k);
while(!q.empty()){
int p = q.front();
q.pop();
vis[p] = false;
for(int i = h[p]; i != -1; i = e[i].next){
int x = e[i].to;
if(dis[x] > dis[p] + e[i].w){
dis[x] = dis[p] + e[i].w;
if(!vis[x]){
vis[x] = true;
total[x]++;
if(total[x] == n + 1)
return false;
q.push(x);
}
}
}
}
return true;
}
int main()
{
memset(h, -1, sizeof(h));
cin >> n >> m;
for(int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
add(b, a, c);
}
for(int i = 1; i <= n; i++)
add(0, i, 0);
bool flag = spfa(0);
if(!flag)
cout << "NO" << endl;
else{
for(int i = 1; i <= n; i++)
cout << dis[i] << " ";
}
return 0;
}
【模板】差分约束算法
最新推荐文章于 2023-02-20 15:18:07 发布