Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <iostream>
- # include <vector>
- using namespace std;
- vector < vector<int> > g, gr;
- vector<char> used;
- vector<int> order, component;
- void dfs1 (int v) {
- used[v] = true;
- for (size_t i=0; i<g[v].size(); ++i)
- if (!used[ g[v][i] ])
- dfs1 (g[v][i]);
- order.push_back (v);
- }
- void dfs2 (int v) {
- used[v] = true;
- component.push_back (v);
- for (size_t i=0; i<gr[v].size(); ++i)
- if (!used[ gr[v][i] ])
- dfs2 (gr[v][i]);
- }
- int main() {
- int n, m, i;
- cin >> n >> m;
- vector<int> a(n);
- for (i = 0; i < n; i++)
- {
- cin >> a[i];
- }
- for (i = 0;i < m; i++) {
- int a, b;
- cin >> a >> b;
- a -= 1;
- b -= 1;
- g[a].push_back(b);
- gr[b].push_back(a);
- }
- vector<int> comps(0);
- used.assign (n, false);
- for (int i=0; i<n; ++i)
- if (!used[i])
- dfs1(i);
- used.assign(n, false);
- int last;
- for (int i=0; i<n; ++i) {
- int v = order[n-1-i];
- if (!used[v]) {
- dfs2(v);
- comps.push_back(0);
- last = comps.size() - 1;
- for (i = 0; i < component.size(); i++)
- {
- comps[last] += a[component[i]];
- }
- component.clear();
- }
- }
- int sum = 0;
- int minimum = -1;
- for (i = 0; i < comps.size(); i++)
- {
- sum += comps[i];
- if (minimum == -1)
- {
- minimum = comps[i];
- }
- else
- {
- minimum = min(minimum, comps[i]);
- }
- }
- cout << sum - minimum;
- }
Advertisement
Add Comment
Please, Sign In to add comment