Cod sursa(job #936369)

Utilizator octavianOctavian Crintea octavian Data 6 aprilie 2013 20:48:25
Problema Parcurgere DFS - componente conexe Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>

class Graph {
public:
     Graph(const char* file);
    ~Graph();
    
    void read(const char* file);
    void dfs();
    void dfsVisit(int u);
    int  getNoCC();

private:
    int               N;
    int               M;
    std::vector<int>* adj;
    bool*             visited;
    int               noCC;
};

int main()
{
    Graph G("dfs.in");
    G.dfs();
    std::ofstream fout("dfs.out");
    fout << G.getNoCC() << '\n';
    fout.close();
    
    return 0;
}

Graph :: Graph(const char* file) :
    adj(NULL),
    visited(NULL),
    noCC(0)
{
    read(file);
}

Graph :: ~Graph()
{
    delete[] adj;
    delete[] visited;
}

void Graph :: read(const char* file)
{
    std::ifstream fin(file);
    int i, j;
    fin >> N >> M;
    adj = new std::vector<int> [N + 1];
    while (fin >> i >> j) {
        adj[i].push_back(j);
    }
    fin.close();
}

void Graph :: dfs()
{
    visited = new bool[N + 1];
    for (int i = 1; i <= N; i++) {
        visited[i] = false;
    }
    noCC = 0;
    
    for (int u = 1; u <= N; u++) {
        if (!visited[u]) {
            dfsVisit(u);
            noCC++;
        }
    }
}

void Graph :: dfsVisit(int u)
{
    visited[u] = true;
    for (unsigned int i = 0; i < adj[u].size(); i++) {
        if (!visited[adj[u][i]]) {
            dfsVisit(adj[u][i]);
        }
    }
}

int Graph :: getNoCC()
{
    return noCC;
}