Pagini recente » Cod sursa (job #2902446) | Cod sursa (job #2227012) | Cod sursa (job #7048) | Cod sursa (job #1674804) | Cod sursa (job #3243170)
#include <fstream>
#include <queue>
#include <stack>
using namespace std;
stack <int> s, r[100005];
vector <int> v[100005];
int cnt, f[100005], l[100005], p[100005], cu=1;
void dfs(int i)
{
f[i]=cu;
cu++;
l[i]=f[i];
s.push(i);
p[i]=1;
for(auto ed : v[i])
{
if(f[ed]==0)
{
dfs(ed);
l[i]=min(l[ed], l[i]);
}
else if(p[ed]==1)
{
l[i]=min(f[ed], l[i]);
}
}
cout<<l[i]<<"! ";
if(l[i]==f[i])
{
cnt++;
while(s.top()!=i)
{
r[cnt].push(s.top());
p[s.top()]=0;
s.pop();
}
r[cnt].push(s.top());
p[s.top()]=0;
s.pop();
}
}
int main()
{
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int n, m, a, b;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>a>>b;
v[a].push_back(b);
}
for(int i=1;i<=n;i++)
{
if(f[i]==0)
{
dfs(i);
}
}
cout<<cnt<<'\n';
for(int i=1;i<=cnt;i++)
{
while(r[i].size()>0)
{
cout<<r[i].top()<<" ";
r[i].pop();
}
cout<<'\n';
}
return 0;
}