ronith
9/8/2018 - 9:53 AM

Find k-cores of an undirected graph

Given a graph G and an integer K, K-cores of the graph are connected components that are left after all vertices of degree less than k have been removed.

#include <bits/stdc++.h>
using namespace std;

class graph {
    int v;
    list <int> *adj;
public:
    graph (int v) {
        this->v = v;
        adj = new list<int> [v];
    }
    void addEdge (int u, int w) {
        adj[u].push_back(w);
        adj[w].push_back(u);
    }
    void print();
    void kCores (int k);
    bool DFSUtil(int , vector <bool> &, vector <int> &, int );
};
void graph::print() {
    for (int i=0;i<v; i++) {
        cout<< i ;
        list<int>::iterator j;
        for (j= adj[i].begin(); j!= adj[i].end(); ++j)
            cout<< " - " << *j;
        cout<< "\n";
    }
}
bool graph::DFSUtil(int s, vector<bool> &visited, vector<int> &d, int k) {
    visited[s] = 1;
    list<int>::iterator i;
    for (i= adj[s].begin(); i!= adj[s].end(); ++i) {
        if (d[s]<k)
            d[*i]--;
        if (!visited[*i]) {
            if (DFSUtil(*i, visited, d, k))
                d[s]--;
        }
    }
    return (d[s]<k);
}
void graph::kCores(int k) {
    vector <bool> visited(v, false);
    vector <int> d(v);
    int mdeg = INT_MAX, s;
    for (int i=0; i<v; i++) {
        d[i] = adj[i].size();
        if (d[i]< mdeg) {
            mdeg = d[i];
            s = i;
        }
    }
    DFSUtil(s, visited, d, k);

    for (int i=0; i<v; i++)
        if (!visited[i])
            DFSUtil(i, visited, d, k);

    for (int i=0; i<v;i++) {
        if (d[i]>= k) {
            cout<< i;
            list<int>::iterator j;
            for (j= adj[i].begin(); j!= adj[i].end(); ++j)
                if (d[*j]>= k)
                    cout<< " - "<< *j;
            cout<< "\n";
        }
    }
}

int main() {
    int k=3, v= 9;
    graph g(v);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(1, 5);
    g.addEdge(2, 3);
    g.addEdge(2, 4);
    g.addEdge(2, 5);
    g.addEdge(2, 6);
    g.addEdge(3, 4);
    g.addEdge(3, 6);
    g.addEdge(3, 7);
    g.addEdge(4, 6);
    g.addEdge(4, 7);
    g.addEdge(5, 6);
    g.addEdge(5, 8);
    g.addEdge(6, 7);
    g.addEdge(6, 8);

    g.print();
    cout<< "-----------------------------\n";
    g.kCores(k);
}