Pagini recente » Cod sursa (job #1168665) | Cod sursa (job #775042) | Cod sursa (job #1003093) | Cod sursa (job #2853260) | Cod sursa (job #1456239)
#include <iostream>
#include <vector>
#include <stack>
#include <cstdio>
#include <iterator>
#include <cstdlib>
#define MAX 1000000
using namespace std;
class Graph {
private:
vector<int> *adjList;
int nr_noduri;
int nr_conexe;
public:
Graph(int nr_noduri) {
this->nr_noduri = nr_noduri;
adjList = new vector<int>[nr_noduri + 2];
nr_conexe = 0;
}
~Graph() {
delete[] adjList;
}
void addEdge(int u, int v) {
adjList[u].push_back(v);
}
/*
void DFS_iterative(int root_node) {
bool *visited = new bool[MAX];
for(int i = 0; i < nr_noduri; i++) {
visited[i] = false;
}
visited[root_node] = true;
stack<int> S;
S.push(root_node);
int node;
vector<int>::iterator it;
cout << "DFS: ";
while(!S.empty()) {
node = S.top();
S.pop();
nr_conexe++;
cout << node << " ";
if(visited[node] == false) {
visited[node] = true;
}
for(it = adjList[node].begin(); it != adjList[node].end(); ++it) {
S.push(*it);
}
}
cout << endl;
}
void DFS_recursive(int start_node) {
visited[start_node] = true;
vector<int>::iterator it;
// cout << "\nDFS_recursive: ";
cout << start_node << " ";
for(it = adjList[start_node].begin(); it != adjList[start_node].end(); ++it) {
// cout << *it << " ";
if(visited[*it] == false) {
nr_conexe++;
//visited[*it] = true;
DFS_recursive(*it);
}
}
}*/
void DFShelper(int node, bool *visited) {
visited[node] = true;
cout << node << " ";
for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); it++) {
if(visited[*it] == false) {
visited[*it] = true;
DFShelper(*it, visited);
}
}
}
void DFS() {
bool *visited = new bool[nr_noduri + 2];
//nr_conexe = 0;
for(int i = 1; i <= nr_noduri; i++) {
visited[i] = false;
}
for(int i = 1; i <= nr_noduri; i++) {
if(!visited[i]) {
nr_conexe++;
DFShelper(i, visited);
}
}
delete[] visited;
}
/*
bool getVisitedInfo(int node) {
if(this->visited[node] == true) return true;
else return false;
}
*/
int getNrConexe() {
return this->nr_conexe;
}
};
int main(int argc, char const *argv[])
{
FILE *f, *fwr;
fwr = fopen("dfs.out", "w");
//if((f = fopen("grader_test1.in", "r")) == NULL) {
if((f = fopen("dfs.in", "r")) == NULL) {
fprintf(stderr, "Can't open file\n");
return 0;
}
int N, M, x ,y;
fscanf(f, "%d %d", &N, &M);
cout << N << " " << M << endl;
Graph g(N);
for(int i = 0; i < M; i++) {
fscanf(f, "%d %d", &x, &y);
cout << x << " " << y << endl;
g.addEdge(x,y);
}
/*
//root_node = 50;
//g.DFS_iterative(root_node);
int nr_conexe = 0;
for(int i = 1; i <= N; i++) {
if(!g.getVisitedInfo(i)) {
nr_conexe++;
g.DFS_recursive(i);
}
}
*/
g.DFS();
printf("\nNr de componente conexe: %d\n", g.getNrConexe());
fprintf(fwr, "%d\n", g.getNrConexe());
fclose(f);
fclose(fwr);
return 0;
}