Pagini recente » Istoria paginii utilizator/andrei28 | Istoria paginii utilizator/anais_dragomir | Profil Sorin96 | Profil ABBogdan | Cod sursa (job #439968)
Cod sursa(job #439968)
/*
* PA 2010
* Laborator 7 - Aplicatii DFS
*
* Determinarea componentelor tare conexe
*
*/
#include <cstdio> // printf, scanf
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
#define min(a, b) ((a) < (b) ? (a) : (b))
enum culoare {ALB, GRI, NEGRU};
typedef vector<int> *graf_t;
int n, m;
graf_t G, GT; // lista de adiacenta si transpusa
stack<int> S;
culoare *c;
vector <vector<int> > sol;
void read_data(const char *filename)
{
ifstream fin;
int x, y;
fin.open(filename);
fin >> n >> m;
G = new vector<int>[n];
GT = new vector<int>[n];
for (int i = 0; i < m; i++) {
fin >> x >> y;
x--; y--; // indexare de la 0
G[x].push_back(y);
GT[y].push_back(x);
}
}
/* Kosaraju */
void dfs(int v, graf_t lst)
{
c[v] = GRI;
for (int i = 0; i < lst[v].size(); i++) {
int u = lst[v][i];
if (c[u] == ALB)
dfs(u, lst);
}
c[v] = NEGRU;
S.push(v);
}
void dfsT(int v, graf_t lst, vector<int> &comp)
{
c[v] = GRI;
comp.push_back(v);
for (int i = 0; i < lst[v].size(); i++) {
int u = lst[v][i];
if (c[u] == ALB)
dfsT(u, lst, comp);
}
c[v] = NEGRU;
}
void ctc_kosaraju()
{
c = new culoare[n];
for (int i = 0; i < n; i++)
c[i] = ALB;
for (int v = 0; v < n; v++)
if (c[v] == ALB) {
dfs(v, G);
}
for (int i = 0; i < n; i++)
c[i] = ALB;
while (!S.empty()) {
int vf = S.top();
S.pop();
if (c[vf] == ALB) {
// o noua componenta
vector<int> temp;
dfsT(vf, GT, temp);
sol.push_back(temp);
}
}
}
void print_sol(const char *filename)
{
ofstream fout;
fout.open(filename);
fout << sol.size() << endl;
for (int i = 0; i < sol.size(); i++) {
for (int j = 0; j < sol[i].size(); j++)
fout << sol[i][j] + 1 << " ";
fout << endl;
}
fout.close();
}
int main()
{
read_data("ctc.in");
ctc_kosaraju();
print_sol("ctc.out");
return 0;
}