Pagini recente » Cod sursa (job #283273) | Cod sursa (job #3254356) | Cod sursa (job #2129721) | Cod sursa (job #1161394) | Cod sursa (job #1458220)
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>
#define NIL -1
using namespace std;
class Graph {
private:
vector<int> *adjList;
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];
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 CTC_Tarjan() {
bool *stackMember = new bool[this->nr_noduri + 2];
int *low = new int[this->nr_noduri + 2]; // lowest ancestor time
int *disc = new int[this->nr_noduri + 2]; //discovery time
stack<int> S;
for(int i = 1; i <= this->nr_noduri; ++i) {
stackMember[i] = false;
low[i] = NIL;
disc[i] = NIL;
}
for(int node = 1; node <= this->nr_noduri; ++node) {
for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); ++it) {
if(disc[*it] == NIL) //node is not visited <=> !visited[i]
CTC_Tarjan_Util(*it,low,disc,S,stackMember);
}
}
}
void CTC_Tarjan_Util(int node, int *low, int *disc,stack<int> S, bool *stackMember) {
int time = 0;
disc[node] = low[node] = ++time;
S.push(node);
stackMember[node] = true;
for(vector<int>::iterator it = adjList[node].begin(); it != adjList[node].end(); ++it) {
if(disc[*it] == NIL) {
CTC_Tarjan_Util(*it, low, disc, S, stackMember);
low[node] = min(low[node], low[*it]);
}
else if(stackMember[*it] == true) {
low[node] = min(low[node], disc[*it]);
}
}
int w = 0;
//head node found, pop the stack and print CTC
if(low[node] == disc[node]) {
while(S.top() != node) {
w = S.top();
cout << w << ' ';
stackMember[w] = false;
S.pop();
}
w = S.top();
cout << w << ' ';
stackMember[w] = false;
S.pop();
}
}
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);
Graph g(N);
for(int i = 0; i < M; i++) {
fscanf(f, "%d %d", &x, &y);
g.addEdge(x,y);
}
g.CTC_Tarjan(); cout << endl;
cout << g.getCTC() << endl;
fprintf(fwr, "%d\n", g.getCTC());
fclose(f);
fclose(fwr);
return 0;
}