Advertisement
Dang_Quan_10_Tin

Negative Cycles :(

Oct 14th, 2020 (edited)
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <stack>
  4. #include <bitset>
  5. #include <algorithm>
  6. #include <vector>
  7. #define task ""
  8.  
  9. using namespace std;
  10. using ll = long long;
  11. using ld = long double;
  12.  
  13. const int N = 2e3 + 500 + 2;
  14. int n, m, u[N * 2], v[N * 2], par[N];
  15. const ll Inf = 1e18;
  16. ll w[N * 2], d[N];
  17. vector<int> nadj[N];
  18. int ans = 0;
  19. bool vis[N];
  20.  
  21. void Read()
  22. {
  23.     cin >> n >> m;
  24.     for (int i = 1; i <= m; ++i)
  25.         cin >> u[i] >> v[i] >> w[i];
  26. }
  27.  
  28. bool Bellman()
  29. {
  30.     for (int i = 1; i < n; ++i)
  31.     {
  32.         for (int j = 1; j <= m; ++j)
  33.             if (d[v[j]] > d[u[j]] + w[j])
  34.             {
  35.                 d[v[j]] = d[u[j]] + w[j];
  36.                 par[v[j]] = u[j];
  37.             }
  38.     }
  39.     for (int j = 1; j <= m; ++j)
  40.         if (d[v[j]] > d[u[j]] + w[j])
  41.             return true;
  42.     return false;
  43. }
  44.  
  45. bool dfs(int v)
  46. {
  47.     vis[v] = 1;
  48.     for (auto i : nadj[v])
  49.         if (!vis[i])
  50.         {
  51.             if (dfs(i))
  52.                 return true;
  53.         }
  54.         else
  55.         {
  56.             ans = i;
  57.             return true;
  58.         }
  59.     return false;
  60. }
  61.  
  62. void Solve()
  63. {
  64.     if (!Bellman())
  65.     {
  66.         cout << "NO";
  67.         return;
  68.     }
  69.     cout << "YES\n";
  70.     for (int i = 1; i <= n; ++i)
  71.         nadj[par[i]].push_back(i);
  72.     for (int i = 1; i <= n; ++i)
  73.         if (!vis[i])
  74.             if (dfs(i))
  75.             {
  76.                 int v = ans;
  77.                 stack<int> ok;
  78.                 ok.push(v);
  79.                 do
  80.                 {
  81.                     ok.push(v = par[v]);
  82.                 } while (v != ans);
  83.                 while (ok.size())
  84.                 {
  85.                     cout << ok.top() << " ";
  86.                     ok.pop();
  87.                 }
  88.                 return;
  89.             }
  90. }
  91.  
  92. int32_t main()
  93. {
  94.     ios_base::sync_with_stdio(0);
  95.     cin.tie(0);
  96.     cout.tie(0);
  97.     if (fopen(task ".INP", "r"))
  98.     {
  99.         freopen(task ".INP", "r", stdin);
  100.         freopen(task ".OUT", "w", stdout);
  101.     }
  102.     Read();
  103.     Solve();
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement