Pagini recente » Cod sursa (job #2638866) | Cod sursa (job #438482) | Cod sursa (job #2797263) | Cod sursa (job #2575765) | Cod sursa (job #2973404)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ctc.in");
ofstream fout("ctc.out");
const int N=100001;
int n,m,cnt,dfn[N],low[N],nr;
bool ins[N];
vector<int> adj[N],stk,con;
vector<vector<int>>sol;
void tarjan(int u) {
dfn[u]=low[u]=++cnt;
stk.push_back(u); ins[u]=true;
for(int i=0; i<adj[u].size(); i++) {
int v=adj[u][i];
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(ins[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]) {
nr++;
con.clear();
while(stk.back()!=u) {
int v=stk.back();
stk.pop_back();
con.push_back(v);
ins[v]=false;
}
int v=stk.back();
stk.pop_back();
con.push_back(v);
sol.push_back(con);
ins[v]=false;
}
}
int main() {
fin>>n>>m;
for(int i=0; i<m; i++) {
int u,v;
fin>>u>>v;
adj[u].push_back(v);
}
for(int i=1; i<=n; i++) {
if(!dfn[i]) tarjan(i);
}
fout<<sol.size()<<"\n";
for(int i=0;i<sol.size();i++){
for(int j=0;j<sol[i].size();j++)
fout<<sol[i][j]<<" ";
fout<<"\n";
}
return 0;
}