Untitled
unknown
plain_text
a year ago
1.6 kB
4
Indexable
#include <ios> #include <iostream> #include <vector> struct flow_type { int64_t left{ 0 }; int64_t right{ 0 }; }; struct data_type { const int n; std::vector<int> left; std::vector<int> right; std::vector<std::vector<int>> graph; data_type(int n): n(n) {} }; void dfs(int v, std::vector<bool>& visited, const data_type& data, flow_type& flow) { if (v > data.n) { flow.right += data.right[v - data.n]; } else { flow.left += data.left[v]; } visited[v] = true; for(size_t i = 0; i < data.graph[v].size(); ++i) { int to = data.graph[v][i]; if (!visited[to]) { dfs(to, visited, data, flow); } } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int n, k; std::cin >> n; std::cin >> k; data_type data(n); data.left.resize(n + 1, 0); data.right.resize(n + 1, 0); data.graph.resize(2*n + 1, std::vector<int>()); for (int i = 1; i <= n; ++i) { std::cin >> data.left[i]; } for (int i = 1; i <= n; ++i) { std::cin >> data.right[i]; } int from, to; for (int i = 0; i < k; ++i) { std::cin >> from; std::cin >> to; data.graph[from].push_back(to + n); data.graph[to + n].push_back(from); } int64_t res = 0; std::vector<bool> visited(data.graph.size(), false); for(int i = 1; i <= n; i++) { if(!visited[i]) { flow_type flow; dfs(i, visited, data, flow); res += std::min(flow.left, flow.right); } } std::cout << res << "\nm"; return 0; }
Editor is loading...
Leave a Comment