Pagini recente » Cod sursa (job #1019067) | Cod sursa (job #2312997) | Cod sursa (job #3186941) | Cod sursa (job #671267) | Cod sursa (job #1453680)
#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;
}