Pagini recente » Cod sursa (job #1558) | Cod sursa (job #637077) | Cod sursa (job #2913275) | Cod sursa (job #1765152) | Cod sursa (job #2925760)
#include <bits/stdc++.h>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
int n,m, cc=0, id=0;
vector<vector<int>> raspuns;
void dfs(int nod, vector<vector<int>> &lista, vector<int> &id_nod, vector<int> &low_link, vector<bool> &apare_stiva, stack<int> &stiva)
{
stiva.push(nod);
apare_stiva[nod] = true;
id_nod[nod] = id;
low_link[nod] = id;
id++;
for(auto i=lista[nod].begin(); i!=lista[nod].end(); i++)
{
if(id_nod[*i] == -1)
{
dfs(*i, lista, id_nod, low_link, apare_stiva, stiva);
}
if(apare_stiva[*i] == true)
{
low_link[nod] = min(low_link[nod], low_link[*i]);
}
}
if(id_nod[nod] == low_link[nod])
{
vector<int> temp;
int c = stiva.top();
temp.push_back(c);
while(c != nod){
apare_stiva[c] = false;
low_link[c] = id_nod[nod];
stiva.pop();
c = stiva.top();
temp.push_back(c);
}
apare_stiva[c] = false;
low_link[c] = id_nod[nod];
stiva.pop();
cc++;
raspuns.push_back(temp);
}
}
int main(){
vector<vector<int>> lista;
vector<int> id_nod, low_link;
vector<bool> apare_stiva;
stack<int> stiva;
fin>>n>>m;
for(int i=0;i<=n;i++)
{
lista.push_back({});
id_nod.push_back(-1);
low_link.push_back(0);
apare_stiva.push_back(false);
}
for(int i=0;i<m;i++)
{
int a,b;
fin>>a>>b;
lista[a].push_back(b);
}
for(int i=1; i<=n;i++)
{
if(id_nod[i] == -1)
{
dfs(i, lista,id_nod, low_link, apare_stiva, stiva);
}
}
fout<<cc<<endl;
for(auto i:raspuns)
{
for(auto j:i)
{
fout<<j<<" ";
}
fout<<endl;
}
return 0;
}