Pagini recente » Cod sursa (job #2046983) | Cod sursa (job #1882595) | Cod sursa (job #98799) | Cod sursa (job #2890790) | Cod sursa (job #2796574)
#include <iostream>
#include<fstream>
#include <list>
#include <vector>
using namespace std;
#define nevizitat -1
vector <int> indecsi, low_link, stiva;
vector <list<int>>componente;
list <int> componenta;
vector <bool> in_stiva;
int idd, numar_componente;
int N,M;
vector<list<int> > L;
void afisare2(vector<list<int> > &L)
{
for(int i = 1; i<L.size();i++)
{
cout << i << ":";
for(int j:L[i])
cout << j << " ";
cout << "\n";
}
}
void citireGraf(int &N, int &M, vector<list<int>> &L, const char *filename)
{
ifstream fin(filename);
int x,y;
fin >> N >> M;
L.resize(N+1);
for (int i=1; i<=M; i++)
{
fin >> x >> y;
L[x].push_back(y);
}
fin.close();
}
afisare_componente(const vector<list<int>>C, const char *filename)
{
ofstream fout(filename);
fout << numar_componente << "\n";
for(int i=0; i<numar_componente; i++)
{
for(auto nod: C[i])
fout << nod << " ";
fout << "\n";
}
fout.close();
}
void tarjan_dfs(int id, const vector<list<int>>L)
{
indecsi[id] = low_link[id] = idd++;
stiva.push_back(id);
in_stiva[id] = true;
for(auto nod : L[id])
{
if(indecsi[nod] == nevizitat)
tarjan_dfs(nod, L);
if(in_stiva[nod])
low_link[id] = low_link[nod] < low_link[id] ? low_link[nod]: low_link[id];
}
if(indecsi[id] == low_link[id])
{
int nod;
componenta.clear();
//cout << "Componenta " << numar_componente + 1 << " contine nodurile: ";
do
{
nod = stiva.back();
//cout << nod << " ";
componenta.push_back(nod);
stiva.pop_back();
in_stiva[nod] = false;
} while(nod != id);
//cout << "\n";
componente.push_back(componenta);
numar_componente++;
}
}
int main()
{
citireGraf(N,M,L,"ctc.in");
// afisare2(L);
indecsi.resize(N+1), indecsi.assign(N+1, nevizitat);
low_link.resize(N+1), low_link.assign(N+1,0);
in_stiva.resize(N+1), in_stiva.assign(N+1, false);
for(int i = 1; i<= N; i++)
if(indecsi[i] == nevizitat)
tarjan_dfs(i, L);
//cout << "Numarul de componente tare conexe: " << numar_componente << "\n";
afisare_componente(componente,"ctc.out");
return 0;
}