makut

meow

Jan 11th, 2016
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # include <iostream>
  2. # include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector < vector<int> > g, gr;
  7. vector<char> used;
  8. vector<int> order, component;
  9.  
  10. void dfs1 (int v) {
  11.     used[v] = true;
  12.     for (size_t i=0; i<g[v].size(); ++i)
  13.         if (!used[ g[v][i] ])
  14.             dfs1 (g[v][i]);
  15.     order.push_back (v);
  16. }
  17.  
  18. void dfs2 (int v) {
  19.     used[v] = true;
  20.     component.push_back (v);
  21.     for (size_t i=0; i<gr[v].size(); ++i)
  22.         if (!used[ gr[v][i] ])
  23.             dfs2 (gr[v][i]);
  24. }
  25.  
  26. int main() {
  27.     int n, m, i;
  28.     cin >> n >> m;
  29.     vector<int> a(n);
  30.     for (i = 0; i < n; i++)
  31.     {
  32.         cin >> a[i];
  33.     }
  34.     for (i = 0;i < m; i++) {
  35.         int a, b;
  36.         cin >> a >> b;
  37.         a -= 1;
  38.         b -= 1;
  39.         g[a].push_back(b);
  40.         gr[b].push_back(a);
  41.     }
  42.     vector<int> comps(0);
  43.     used.assign (n, false);
  44.     for (int i=0; i<n; ++i)
  45.         if (!used[i])
  46.             dfs1(i);
  47.     used.assign(n, false);
  48.     int last;
  49.     for (int i=0; i<n; ++i) {
  50.         int v = order[n-1-i];
  51.         if (!used[v]) {
  52.             dfs2(v);
  53.             comps.push_back(0);
  54.             last = comps.size() - 1;
  55.             for (i = 0; i < component.size(); i++)
  56.             {
  57.                 comps[last] += a[component[i]];
  58.             }
  59.             component.clear();
  60.         }
  61.     }
  62.     int sum = 0;
  63.     int minimum = -1;
  64.     for (i = 0; i < comps.size(); i++)
  65.     {
  66.         sum += comps[i];
  67.         if (minimum == -1)
  68.         {
  69.             minimum = comps[i];
  70.         }
  71.         else
  72.         {
  73.             minimum = min(minimum, comps[i]);
  74.         }
  75.     }
  76.     cout << sum - minimum;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment