Pagini recente » Cod sursa (job #1271738) | Cod sursa (job #1403664) | Cod sursa (job #1750350) | Cod sursa (job #3160149) | Cod sursa (job #359069)
Cod sursa(job #359069)
//Algoritmul de depistare a componentelor tari-conexe
//Algoritmul '+' / '-'
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
vector<vector< int > > g;
vector<vector< int > > gt;
int nodes;
void read(const char * buff_file)
{
//fstream f("RoyWarshall.in", ios::in);
fstream f("ctc.in", ios::in);
if (f == NULL)
{
cerr<<"Eroare!";
exit(0);
}
else
{
int edges, left, right;
f>>nodes;
f>>edges;
g.reserve(nodes+1);
g.resize(nodes+1);
gt.reserve(nodes+1);
gt.reserve(nodes+1);
for (int i=1; i<=edges; ++i)
{
f>>left>>right;
g[left].push_back(right);
gt[right].push_back(left);
}
f.close();
}
};
bool * used;
bool * minusDF;
bool * plusDF;
void DFS(int i, vector<vector<int> > &aux, bool *&temp)
{
for (vector<int >::iterator it = aux[i].begin(); it < aux[i].end(); it++)
{
if (temp[*it] == 0 && used[*it]==0)
{
temp[*it]=1;
DFS(*it, aux, temp);
}
}
};
void set0(bool *&aux, int nr_aux=nodes)
{
for (int i=1; i<=nr_aux; ++i)
aux[i]=0;
};
vector<vector<int > > out;
int nr;
void PlusMinus()
{
out.reserve(nodes+1);
out.resize(nodes+1);
queue<int> Q;
used=new bool[nodes+1];
minusDF=new bool[nodes+1];
plusDF=new bool[nodes+1];
set0(used);
for (int i=1; i<=nodes; ++i)
{
if (used[i]==0)
{
set0(minusDF);
set0(plusDF);
used[i]=1;
Q.push(i);
nr++;
plusDF[i]=1;
DFS(i, g, plusDF);
minusDF[i]=1;
DFS(i, gt, minusDF);
for (int j=1; j<=nodes; ++j)
{
if (plusDF[j] && minusDF[j] && used[j]==0)
{
Q.push(j);
used[j]=1;
}
}
}
if (!Q.empty())
{
while (!Q.empty())
{
//cout<<Q.front()<<" ";
//out<<Q.front()<<" ";
out[nr].push_back(Q.front());
Q.pop();
}
//cout<<"\n";
//out<<"\n";
}
}
}
void print()
{
fstream g("ctc.out", ios::out);
g<<nr<<"\n";
for (int i=1; i<=nr; ++i)
{
for (vector<int> ::iterator it=out[i].begin(); it < out[i].end(); it++)
g<<*it<<" ";
g<<"\n";
}
}
int main()
{
read("ctc.in");
PlusMinus();
print();
return 0;
}