Pagini recente » Cod sursa (job #1118026) | Cod sursa (job #1920654) | Cod sursa (job #1770898) | Cod sursa (job #1955049) | Cod sursa (job #937832)
Cod sursa(job #937832)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
#define N_MAX 100000
vector <int> graf[N_MAX];
vector <int> graf_transpus[N_MAX];
vector <int> ctc[N_MAX];
stack <int> stiva;
bool selectat[N_MAX];
int numar_ctc;
void df(int nod)
{
selectat[nod] = true;
for (unsigned int i=0;i<graf[nod].size();i++)
if (selectat[graf[nod][i]] == false)
df(graf[nod][i]);
stiva.push(nod);
}
void df_transpus(int nod)
{
selectat[nod] = true;
ctc[numar_ctc].push_back(nod);
for (unsigned int i=0;i<graf_transpus[nod].size();i++)
if (selectat[graf_transpus[nod][i]] == false)
df_transpus(graf_transpus[nod][i]);
}
int main()
{
numar_ctc = 0;
int n,m,i;
ifstream f("ctc.in");
f >> n >> m;
for (i=0;i<m;i++)
{
int x,y;
f >> x >> y;
--x;
--y;
graf[x].push_back(y);
graf_transpus[y].push_back(x);
}
f.close();
for(i=0;i<n;++i)
selectat[i] = false;
for (i=0;i<n;++i)
if (selectat[i] == false)
df(i);
for(i=0;i<n;++i)
selectat[i] = false;
while (!stiva.empty())
{
int nod = stiva.top();
stiva.pop();
if (selectat[nod] == false)
{
df_transpus(nod);
++numar_ctc;
}
}
ofstream g("ctc.out");
g << numar_ctc;
unsigned int j;
for (i=0;i<numar_ctc;i++)
{
g << endl;
for (j=0;j<ctc[i].size();j++)
g << ctc[i][j]+1 << " ";
}
g.close();
return 0;
}