Cod sursa(job #1453680)

Utilizator ramhackNastase Ramon ramhack Data 24 iunie 2015 08:35:40
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;


enum Color
{
	WHITE, 
	GRAY, 
	BLACK
};

struct NodeInfo {

	int  parent;
	Color color;
	int time_start, time_finish;

	NodeInfo() {
		parent = -1;
		color = WHITE;
		time_start = time_finish = -1;
	}

};

class Graph {
private:
    vector<int> *adjList;
    vector<NodeInfo> nodeInfo;
    int size;	
    int time;
    int connected_comp;
public:
    Graph(int size) {
        this->size = size;
        connected_comp = 0;
        adjList = new vector<int>[this->size + 2];
    }
    ~Graph() {
        delete[] adjList;
    }

    void addEdge(int u, int v) {
        adjList[u].push_back(v);
    }

    void DFS() {

    	for(int i = 1 ;i <= this->size; ++i) {
    		nodeInfo[i].color = WHITE;
    		nodeInfo[i].parent = -1;
    		nodeInfo[i].time_start = nodeInfo[i].time_finish = -1;
    	}

    	time = 0;

    	for(int i = 1; i <= this->size; ++i) {

    		if(nodeInfo[i].color == WHITE) {
    			connected_comp++;
    			DFS_Visit(i);
    		}
    	}
    }

    void DFS_Visit(int node) {

    	time++;
    	nodeInfo[node].color = GRAY;
    	nodeInfo[node].time_start = time;

    	for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); ++it) {

    		if(nodeInfo[*it].color == WHITE) {
    			nodeInfo[*it].parent = node;
    			DFS_Visit(*it);
    		}
    	}
    	time++;
    	nodeInfo[node].time_finish = time;
    	nodeInfo[node].color = BLACK;
    }



    int getConnectedComp() {
    	return this->connected_comp;
    }
};


int main() {

    FILE *f,*fout;

    //if((f = fopen("dfs_intro_alg.txt","r")) == NULL) {
     if((f = fopen("dfs.in","r")) == NULL) { 
        fprintf(stderr, "Can't open file!\n");
        return 0;
    }
    fout = fopen("dfs.out", "w");
    int N, M, x, y;

    fscanf(f,"%d %d", &N, &M);

    Graph g(N);

    for(int i = 0 ; i < M; i++) {

        fscanf(f,"%d %d", &x, &y);
        g.addEdge(x,y);
    }

    g.DFS();
    cout << "Componente conexe: " << g.getConnectedComp() << endl;
    fprintf(fout, "%d\n", g.getConnectedComp());

    fclose(f);
    fclose(fout);
    return 0;
}