Advertisement
SorahISA

[Luogu 3385] Bellman-Ford

Apr 8th, 2020
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. /* https://www.luogu.com.cn/problem/P3385 */
  2.  
  3. // #pragma GCC target("avx2")
  4. #pragma GCC optimize("O3", "unroll-loops")
  5.  
  6. // #include <bits/extc++.h>
  7. // using namespace __gnu_pbds;
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11.  
  12. #define int long long
  13. #define double long double
  14. // template <typename T>
  15. // using pbds_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  16. using pii = pair<int, int>;
  17. template<typename T>
  18. using prior = priority_queue<T, vector<T>, greater<T>>;
  19. template<typename T>
  20. using Prior = priority_queue<T>;
  21.  
  22. #define X first
  23. #define Y second
  24. #define ALL(x) (x).begin(), (x).end()
  25. #define eb emplace_back
  26. #define pb push_back
  27.  
  28. #define fastIO() ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  29. #define RANDOM() random_device __rd; \
  30.                  mt19937 __gen = mt19937(__rd()); \
  31.                  uniform_int_distribution<int> __dis(0, 1); \
  32.                  auto rnd = bind(__dis, __gen);
  33.  
  34. const int INF = 1E9;
  35. const int mod = 1E9 + 7;
  36. const int maxn = 2000 + 5;
  37.  
  38. vector<pii> adj[maxn];
  39. vector<int> minDis(maxn, INF), vis(maxn, 0);
  40.  
  41. void dfs_reach(int now) {
  42.     vis[now] = 1;
  43.     for (auto [x, dist] : adj[now]) {
  44.         if (!vis[x]) dfs_reach(x);
  45.     }
  46. }
  47.  
  48. bool Bellman_Ford(int n) {
  49.     dfs_reach(0);
  50.  
  51.     for (int t = 0; t < n-1; ++t) {
  52.         for (int i = 0; i < n; ++i) {
  53.             for (auto [x, dist] : adj[i]) minDis[x] = min(minDis[x], minDis[i] + dist);
  54.         }
  55.     }
  56.  
  57.     for (int i = 0; i < n; ++i) {
  58.         for (auto [x, dist] : adj[i]) {
  59.             if (vis[x] and minDis[x] > minDis[i] + dist) return false;
  60.         }
  61.     }
  62.  
  63.     return true;
  64. }
  65.  
  66. void solve() {
  67.     int n, m, u, v, w;
  68.     cin >> n >> m;
  69.  
  70.     while (m--) {
  71.         cin >> u >> v >> w, --u, --v;
  72.         adj[u].eb(v, w);
  73.         if (w >= 0) adj[v].eb(u, w);
  74.     }
  75.  
  76.     if (Bellman_Ford(n)) cout << "N0\n";
  77.     else cout << "YE5\n";
  78. }
  79.  
  80. void init() {
  81.     for (int i = 0; i < maxn; ++i) adj[i].clear();
  82.     vis.assign(maxn, 0);
  83.     minDis.assign(maxn, INF), minDis[0] = 0;
  84. }
  85.  
  86. int32_t main() {
  87.     fastIO();
  88.    
  89.     int t;
  90.     cin >> t;
  91.     while (t--) init(), solve();
  92.    
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement