Pagini recente » Cod sursa (job #2049392) | Cod sursa (job #1040214) | Cod sursa (job #1235604) | Cod sursa (job #1010020) | Cod sursa (job #526258)
Cod sursa(job #526258)
// idx[v]= numara nodurile in ordinea in care sunt descoperite
//owlink[v] = min { idx[u] | u este accesibil din v }. Prin urmare, v este radacina unei
//componente tare conexe daca si numai daca lowlink[v] = idx[v]
#include <fstream>
#include <stack>
#include <vector>
#define nmax 1000
using namespace std;
ifstream f("ctc.in");
ofstream g1("ctc.out");
int n,m,i,Index,idx[nmax],lowlink[nmax];
stack <int> s;
vector <int> g[nmax];
vector < vector <int> > ctc;
bool in_stack[nmax];
void citire ();
void afiseaza ();
void retine_ctc (int v);
void tarjan (int v)
{
idx[v]=Index;
lowlink[v]=Index;
Index=Index+1;
in_stack[v]=true;
s.push(v);
for (int i=0; i<g[v].size(); i++)
{
if (!idx[g[v][i]])
{
tarjan (g[v][i]);
lowlink[v]=min(lowlink[v], lowlink[g[v][i]]);
}
else if (in_stack[g[v][i]])
lowlink[v] = min(lowlink[v], lowlink[g[v][i]]);
}
if (lowlink[v] == idx[v])
retine_ctc (v);
}
void ctc_tarjan ()
{
Index=0;
for (int i=1; i<=n; i++)
if (!idx[i])
tarjan (i);
}
int main ()
{
citire ();
ctc_tarjan ();
afiseaza ();
return 0;
}
void citire ()
{
int x,y;
f>>n>>m;
for (int i=1; i<=m; i++)
{
f>>x>>y;
g[x].push_back(y);
}
f.close ();
}
void retine_ctc (int v)
{
int u;
vector <int> componenta;
do
{
u=s.top();
s.pop ();
in_stack[u]=false;
componenta.push_back (u);
}
while (u!=v);
ctc.push_back (componenta);
}
void afiseaza ()
{
g1<<ctc.size ()-1;
for (int i=0; i<ctc.size ()-1; i++)
{
g1<<'\n';
for (int j=0; j<ctc[i].size (); j++)
g1<<ctc[i][j]<<" ";
}
g1.close ();
}