Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- int n;
- vector<vector<int>> r_Adjacency_list() {
- cin >> n;
- vector<vector<int>> forest(n, vector<int>(0, 0));
- int k;
- for (int i; i != n; ++i) {
- cin >> k;
- for (int j; j != k; ++j) {
- cin >> k;
- forest[i].push_back(k);
- }
- }
- }
- vector<bool> used(n, false);
- void dfs (const int& v, const vector<vector<int>>& forest, vector<int>& tree) {
- /// if (!used[v]) {
- used[v] = true;
- tree.push_back(v);
- for (auto i : forest[v]) {
- if (!used[i]) {
- dfs(i, forest, tree);
- }
- }
- /// }
- }
- vector<vector<int>> find_trees(const vector<vector<int>>& adjacency_list) {
- vector<vector<int>> trees;
- for (int i = 0; i != n; ++i) {
- if (!used[i]) {
- vector<int> tree;
- dfs(i, adjacency_list, tree);
- trees.push_back(tree);
- }
- }
- }
- vector<int> s(n, 0);
- vector<int> bez(n, 0);
- int vertex_cover(const vector<int>& tree, const vector<vector<int>>& forest) {
- if (tree.size() == 1) return 1;
- for (auto i : tree) {
- if (forest[i][0] == 1) {
- s[i] = 1;
- bez[i] = 0;
- } else {
- for (auto j : forest[i]) {
- s[i] += min(s[j], bez[j]);
- bez[i] = s[j];
- }
- }
- }
- for (auto i : tree) {
- if (bez[i] != 0) {
- return min(bez[i], s[i]);
- }
- }
- }
- int main() {
- vector<vector<int>> forest = r_Adjacency_list();
- vector<vector<int>> trees = find_trees(forest);
- int k = 0;
- for (auto tree : trees) {
- k += vertex_cover(tree, forest);
- }
- cout << k;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement