Pagini recente » Cod sursa (job #2249826) | Cod sursa (job #993354) | Cod sursa (job #2647798) | Cod sursa (job #2859616) | Cod sursa (job #2929828)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
int n,m,k,ctc,nod;
stack<int> s;
void tarjan(int v, vector<vector<int>> adiac, vector<int> &index, vector<int> &lowl, vector<bool> &inStiva)
{
//cout<<"tarjan"<<"\n";
s.push(v);
inStiva[v] = true;
index[v] = k;
lowl[v] = k;
k++;
for(auto vec : adiac[v])
{
if (index[vec] == -1)
tarjan(vec,adiac,index,lowl,inStiva);
if (inStiva[vec] == true)
lowl[v] = min(lowl[v],lowl[vec]);
}
if(lowl[v] == index[v])
{
do
{
nod = s.top();
lowl[nod] = index[v];
inStiva[nod] = false;
s.pop();
}while(nod!=v);
ctc++;
}
for (int i = 0; i <= n; i++)
cout<<index[i]<<" ";
cout<<"\n";
for (int i = 0; i <= n; i++)
cout<<lowl[i]<<" ";
cout<<"\n";
cout<<"\n";
}
void afis(vector<int>lowl)
{
g<<ctc<<"\n";
for (int i = 1; i < n; i++)
{
if(lowl[i] == lowl[i+1])
{
g << i << " ";
}
else
{
g << i << "\n";
}
}
if (lowl[n] == lowl[n - 1])
{
g << n << " ";
}
else
{
g << n << "\n";
}
}
int main()
{
int a, b;
f >> n >> m;
vector<int> index(n+1,-1), lowl(n+1,-1);
vector<bool> inStiva(n+1,false);
vector<vector<int>> adiac(n+1);
for (int i = 0; i < m; i++)
{
//cout<<"ok"<<"\n";
f >> a >> b;
adiac[a].push_back(b);
}
for (int i = 1; i <= n; i++)
{cout<<i<<endl;
if(index[i] == -1)
tarjan(i,adiac,index,lowl,inStiva);
}
afis(lowl);
return 0;
}