Pagini recente » Cod sursa (job #3264490) | Cod sursa (job #1974866) | Cod sursa (job #3244024) | Cod sursa (job #2395403) | Cod sursa (job #1456538)
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>
using namespace std;
class Graph {
private:
vector<int> *adjList;
vector<int> *revAdjList;
stack<int> S;
int nr_noduri;
int ctc;
int t;
vector<int> *ctcElements;
public:
Graph(int nr_noduri) {
this->nr_noduri = nr_noduri;
adjList = new vector<int>[nr_noduri + 2];
revAdjList = new vector<int>[nr_noduri + 2];
ctcElements = new vector<int>[nr_noduri + 2];
ctc = t = 0;
}
~Graph() {
delete[] adjList;
}
void addEdge(int u, int v) {
adjList[u].push_back(v);
}
void addEdgeRev(int u, int v) {
revAdjList[u].push_back(v);
}
void DFS(FILE *f) {
bool *visited = new bool[nr_noduri + 2];
for(int i = 1; i <= nr_noduri; i++) {
visited[i] = false;
}
for(int i = 1; i <= nr_noduri; i++) {
if(!visited[i]) {
DFShelper(i, visited, this->adjList, f);
}
}
delete[] visited;
}
void DFShelper(int node, bool *visited, vector<int> *adjList, FILE *f) {
visited[node] = true;
cout << node << " ";
// fprintf(f, "%d ", node);
ctcElements[t].push_back(node);
for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); it++) {
if(visited[*it] == false) {
visited[*it] = true;
DFShelper(*it, visited, adjList, f);
}
}
}
void DFS_Util_Stack(int node, bool *visited) {
visited[node] = true;
for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); it++) {
if(visited[*it] == false) {
visited[*it] = true;
DFS_Util_Stack(*it, visited);
}
}
S.push(node);
}
void Kosaraju_CTC(FILE *f) {
bool *visited = new bool[nr_noduri + 2];
for(int i = 1; i <= nr_noduri; i++) {
visited[i] = false;
}
for(int i = 1; i <= nr_noduri; ++i) { // Does DFS and adds nodes in stack
if(!visited[i]) {
DFS_Util_Stack(i,visited);
}
}
for(int i = 1; i <= nr_noduri; ++i) {
visited[i] = false;
}
while(!S.empty()) {
int node = S.top();
S.pop();
if(!visited[node]) {
DFShelper(node, visited, revAdjList, f);
//fprintf(f, "\n");
cout << endl;
this->t++;
ctc++;
}
}
}
void printCTC(FILE *f) {
for(int i = 0; i < t; ++i) {
for(vector<int>::iterator it = ctcElements[i].begin(); it != ctcElements[i].end(); ++it) {
fprintf(f, "%d ", *it);
}
fprintf(f, "\n");
}
}
int getCTC() {
return this->ctc;
}
};
int main(int argc, char const *argv[])
{
FILE *f, *fwr;
fwr = fopen("ctc.out", "w");
//if((f = fopen("grader_test1.in", "r")) == NULL) {
if((f = fopen("ctc.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);
g.addEdgeRev(y,x);
}
g.Kosaraju_CTC(fwr);
cout << g.getCTC() << endl;
fprintf(fwr, "%d\n", g.getCTC());
g.printCTC(fwr);
fclose(f);
fclose(fwr);
return 0;
}