Reference:
http://www.geeksforgeeks.org/vertex-cover-problem-set-1-introduction-approximate-algorithm-2/
#include <iostream>
#include <Windows.h>
#include <list>
#include <vector>
using namespace std;
class Graph
{
private:
int V;
list<int> *adj; // contains adjacent points
public:
Graph(int v) : V(v), adj(new list<int>[v]) {};
void addEdge(int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
void printVertexCover();
};
void Graph::printVertexCover()
{
vector<int> visited(V, 0); // initialize all vertex as unvisited
for (int u = 0; u < V; ++u)
{
if (visited[u] == 0)
{
for (auto iter = adj[u].begin(); iter != adj[u].end(); ++iter)
{
if (visited[*iter] == 0)
{
visited[*iter] = 1;
visited[u] = 1;
break;
}
}
}
}
for (int i = 0; i < V; ++i)
if (visited[i] == 1)
cout << i << " ";
}
int main()
{
Graph graph(7);
graph.addEdge(0, 1);
graph.addEdge(1, 2);
graph.addEdge(2, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 4);
graph.addEdge(3, 5);
graph.addEdge(3, 6);
graph.addEdge(4, 5);
graph.addEdge(3, 6);
graph.printVertexCover();
cout << endl;
system("PAUSE");
return 0;
}