Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <list>
  5. #include <stack>
  6. #include <string>
  7. #include <cstdio>
  8. #include <vector>
  9.  
  10. #define NIL -1
  11. #define MAXN 101010
  12.  
  13. using namespace std;
  14.  
  15. vector<int> cycles[MAXN];
  16.  
  17. class Graph {
  18.     int amount;
  19.     list<int> *g;
  20.     int current;
  21.     void BFS(int u, int disc[], int low[], stack<int> *st, bool member[]);
  22. public:
  23.     Graph(int amount);
  24.     void addEdge(int from, int to);
  25.     void findCycles();
  26.     int getCurrent() const;
  27.     ~Graph();
  28. };
  29.  
  30. Graph::Graph(int amount) {
  31.     current = 0;
  32.     this->amount = amount;
  33.     g = new list<int>[amount + 1];
  34. }
  35.  
  36. void Graph::addEdge(int from, int to) {
  37.     g[from].push_back(to);
  38. }
  39.  
  40. void Graph::BFS(int u, int disc[], int low[], stack<int> *st, bool member[]) {
  41.     static int time = 0;
  42.  
  43.     disc[u] = low[u] = ++time;
  44.     st->push(u);
  45.     member[u] = true;
  46.  
  47.     list<int>::iterator i;
  48.     for (i = g[u].begin(); i != g[u].end(); ++i) {
  49.         int v = *i;
  50.  
  51.         if (disc[v] == -1) {
  52.             BFS(v, disc, low, st, member);
  53.             low[u] = min(low[u], low[v]);
  54.         }
  55.         else if (member[v] == true)
  56.             low[u] = min(low[u], disc[v]);
  57.     }
  58.  
  59.     int w = 0;
  60.     if (low[u] == disc[u]) {
  61.         while (st->top() != u) {
  62.             w = (int)st->top();
  63.             cycles[current].push_back(w);
  64.             member[w] = false;
  65.             st->pop();
  66.         }
  67.         w = (int)st->top();
  68.  
  69.         cycles[current].push_back(w);
  70.         current++;
  71.  
  72.         member[w] = false;
  73.         st->pop();
  74.     }
  75. }
  76.  
  77.  
  78. void Graph::findCycles() {
  79.     int *disc = new int[amount];
  80.     int *low = new int[amount];
  81.     bool *member = new bool[amount];
  82.     stack<int> *st = new stack<int>();
  83.  
  84.     for (int i = 0; i < amount; i++) {
  85.         disc[i] = NIL;
  86.         low[i] = NIL;
  87.         member[i] = false;
  88.     }
  89.  
  90.     for (int i = 0; i < amount; i++)
  91.         if (disc[i] == NIL) BFS(i, disc, low, st, member);
  92. }
  93.  
  94. int Graph::getCurrent() const {
  95.     return current;
  96. }
  97.  
  98. Graph::~Graph() {
  99.     delete[] g;
  100. }
  101.  
  102. int value[500][500];
  103.  
  104. int main() {
  105.     //freopen("test.txt", "r", stdin);
  106.     //freopen("res.txt", "w", stdout);
  107.     int n, m;
  108.     cin >> n >> m;
  109.     Graph g(n + 1);
  110.  
  111.     for (int i = 0; i < m; i++) {
  112.         int from, to, val;
  113.         cin >> from >> to >> val;
  114.         g.addEdge(from, to);
  115.         value[from][to] = val;
  116.     }
  117.  
  118.     g.findCycles();
  119.     int sz = g.getCurrent();
  120.  
  121.     for (int i = 0; i < sz; i++) {
  122.         if (cycles[i].size() > 1) {
  123.             int min_val = 323002032;
  124.  
  125.             for (int j = cycles[i].size() - 1; j > 0; j--) {
  126.                 min_val = min(min_val, value[cycles[i][j]][cycles[i][j - 1]]);
  127.             }
  128.  
  129.             min_val = min(min_val, value[cycles[i][0]][cycles[i][cycles[i].size() - 1]]);
  130.             cout << "\nMin value in " << i << " cycle: " << min_val << endl;
  131.             cout << endl;
  132.             cout << "Values: " << endl;
  133.  
  134.             for (int j = cycles[i].size() - 1; j > 0; j--) {
  135.                 value[cycles[i][j]][cycles[i][j - 1]] -= min_val;
  136.                 cout << cycles[i][j] << " " << cycles[i][j - 1] << " " << value[cycles[i][j]][cycles[i][j - 1]] << endl;
  137.             }
  138.  
  139.             value[cycles[i][0]][cycles[i][cycles[i].size() - 1]] -= min_val;
  140.             cout << cycles[i][0] << " " << cycles[i][cycles[i].size() - 1] << " " << value[cycles[i][0]][cycles[i][cycles[i].size() - 1]] << endl;
  141.             cout << endl;
  142.         }
  143.     }
  144.  
  145.     system("pause");
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement