/*
Amrutansu Garanaik
This algorithm will only work for a tree (n-ary)
*/
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <list>
#include <string.h>
#define MAX 10000
using namespace std;
vector <vector <int> > graph(MAX);
int nodes;
int edges;
list <int> req_vertices; //will store the vertices of minimum cover
int arr[MAX]; //vertex count
int visit[MAX];
//here tree is represented as a graph, not like we do in binary tree, so tree won't be empty
int minimum_vertex_cover(int root) //returns number of nodes
{
if(visit[root] == 1)
return 0;
if(graph[root].size() == 0) //root has no child
return 0; //as this won't contribute to any edges
if(arr[root] != -1)
return arr[root]; //minimum vertex cover of subtree starting at root
int with_root = 1;
for(int i = 0; i < (int) graph[root].size(); i++)
{
if(visit[graph[root][i]] == 0)
with_root += minimum_vertex_cover(graph[root][i]);
}
int without_root = 0;
for(int i = 0; i < (int) graph[root].size(); i++) //since this root is not included, its children are unvisited, so if their children are
//visited, these nodes will be covered
{
int present = graph[root][i];
for(int j = 0; j < (int) graph[present].size(); j++)
if(visit[graph[present][i]] == 0)
without_root += minimum_vertex_cover(graph[present][i]);
}
arr[root] = with_root < without_root ? with_root : without_root;
visit[root] = 1;
return arr[root];
}
int main()
{
int a, b;
printf("Enter number of nodes : ");
scanf("%d", &nodes);
memset(arr, -1, sizeof(arr));
memset(visit, 0, sizeof(visit));
printf("Enter number of edges : ");
scanf("%d", &edges);
printf("Enter the edges : ");
for(int i=0; i<edges; i++)
{
scanf("%d%d",&a,&b);
graph[a].push_back(b);
graph[b].push_back(a);
}
printf("Number of nodes in vertex cover : %d\n",minimum_vertex_cover(0));
return 0;
}
LyoKCUFtcnV0YW5zdSBHYXJhbmFpawoJVGhpcyBhbGdvcml0aG0gd2lsbCBvbmx5IHdvcmsgZm9yIGEgdHJlZSAobi1hcnkpCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2RlZmluZSBNQVggMTAwMDAKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKdmVjdG9yIDx2ZWN0b3IgPGludD4gPiBncmFwaChNQVgpOwppbnQgbm9kZXM7CmludCBlZGdlczsKbGlzdCA8aW50PiByZXFfdmVydGljZXM7CS8vd2lsbCBzdG9yZSB0aGUgdmVydGljZXMgb2YgbWluaW11bSBjb3ZlcgoKaW50IGFycltNQVhdOwkJCS8vdmVydGV4IGNvdW50CmludCB2aXNpdFtNQVhdOwovL2hlcmUgdHJlZSBpcyByZXByZXNlbnRlZCBhcyBhIGdyYXBoLCBub3QgbGlrZSB3ZSBkbyBpbiBiaW5hcnkgdHJlZSwgc28gdHJlZSB3b24ndCBiZSBlbXB0eQppbnQgbWluaW11bV92ZXJ0ZXhfY292ZXIoaW50IHJvb3QpCS8vcmV0dXJucyBudW1iZXIgb2Ygbm9kZXMKewoJaWYodmlzaXRbcm9vdF0gPT0gMSkKCQlyZXR1cm4gMDsKCWlmKGdyYXBoW3Jvb3RdLnNpemUoKSA9PSAwKQkvL3Jvb3QgaGFzIG5vIGNoaWxkCgkJcmV0dXJuIDA7CQkvL2FzIHRoaXMgd29uJ3QgY29udHJpYnV0ZSB0byBhbnkgZWRnZXMKCWlmKGFycltyb290XSAhPSAtMSkKCQlyZXR1cm4gYXJyW3Jvb3RdOwkvL21pbmltdW0gdmVydGV4IGNvdmVyIG9mIHN1YnRyZWUgc3RhcnRpbmcgYXQgcm9vdAoJCglpbnQgd2l0aF9yb290ID0gMTsKCQoJZm9yKGludCBpID0gMDsgaSA8IChpbnQpIGdyYXBoW3Jvb3RdLnNpemUoKTsgaSsrKQoJewoJCWlmKHZpc2l0W2dyYXBoW3Jvb3RdW2ldXSA9PSAwKQoJCQl3aXRoX3Jvb3QgKz0gbWluaW11bV92ZXJ0ZXhfY292ZXIoZ3JhcGhbcm9vdF1baV0pOwoJfQoJCQoJaW50IHdpdGhvdXRfcm9vdCA9IDA7CgkKCWZvcihpbnQgaSA9IDA7IGkgPCAoaW50KSBncmFwaFtyb290XS5zaXplKCk7IGkrKykJLy9zaW5jZSB0aGlzIHJvb3QgaXMgbm90IGluY2x1ZGVkLCBpdHMgY2hpbGRyZW4gYXJlIHVudmlzaXRlZCwgc28gaWYgdGhlaXIgY2hpbGRyZW4gYXJlCgkJCQkJCQkvL3Zpc2l0ZWQsIHRoZXNlIG5vZGVzIHdpbGwgYmUgY292ZXJlZAoJewoJCWludCBwcmVzZW50ID0gZ3JhcGhbcm9vdF1baV07CgkJZm9yKGludCBqID0gMDsgaiA8IChpbnQpIGdyYXBoW3ByZXNlbnRdLnNpemUoKTsgaisrKQoJCQlpZih2aXNpdFtncmFwaFtwcmVzZW50XVtpXV0gPT0gMCkKCQkJCXdpdGhvdXRfcm9vdCArPSBtaW5pbXVtX3ZlcnRleF9jb3ZlcihncmFwaFtwcmVzZW50XVtpXSk7Cgl9ICAKCQoJYXJyW3Jvb3RdID0gd2l0aF9yb290IDwgd2l0aG91dF9yb290ID8gd2l0aF9yb290IDogd2l0aG91dF9yb290OwoJCgl2aXNpdFtyb290XSA9IDE7CglyZXR1cm4gYXJyW3Jvb3RdOwoJCn0KCmludCBtYWluKCkKewoJaW50IGEsIGI7CglwcmludGYoIkVudGVyIG51bWJlciBvZiBub2RlcyA6ICIpOwoJc2NhbmYoIiVkIiwgJm5vZGVzKTsKCQoJbWVtc2V0KGFyciwgLTEsIHNpemVvZihhcnIpKTsKCW1lbXNldCh2aXNpdCwgIDAsIHNpemVvZih2aXNpdCkpOwoJCglwcmludGYoIkVudGVyIG51bWJlciBvZiBlZGdlcyA6ICIpOwoJc2NhbmYoIiVkIiwgJmVkZ2VzKTsKCXByaW50ZigiRW50ZXIgdGhlIGVkZ2VzIDogIik7Cglmb3IoaW50IGk9MDsgaTxlZGdlczsgaSsrKQoJewoJCXNjYW5mKCIlZCVkIiwmYSwmYik7CgkJZ3JhcGhbYV0ucHVzaF9iYWNrKGIpOwoJCWdyYXBoW2JdLnB1c2hfYmFjayhhKTsKCX0KCQoJcHJpbnRmKCJOdW1iZXIgb2Ygbm9kZXMgaW4gdmVydGV4IGNvdmVyIDogJWRcbiIsbWluaW11bV92ZXJ0ZXhfY292ZXIoMCkpOwoJCgkKCQoJcmV0dXJuIDA7Cn0=