Pagini recente » Cod sursa (job #2834626) | Cod sursa (job #2009083) | Cod sursa (job #2681846) | Cod sursa (job #2038944) | Cod sursa (job #2871124)
#include <bits/stdc++.h>
using namespace std;
const int N = 100001;
vector <int> g[N];
vector <int> gT[N];
int aux[N];
int nrComponente;
bool verif1[N];
void dfs_1(int node)
{
verif1[node] = 1;
for(auto nxt:g[node])
if(!verif1[nxt])
dfs_1(nxt);
aux[++nrComponente] = node;
}
int verif2[N];
int k = 1;
void dfs_2(int node)
{
verif2[node] = k;
for(auto nxt: gT[node])
if(!verif2[nxt])
dfs_2(nxt);
}
pair<int , int> ans[N];
int main()
{
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
g[a].push_back(b);
gT[b].push_back(a); /// construim graful transpus
}
for(int i = 1; i <= n; i++)
{
if(!verif1[i])
dfs_1(i);
}
for(int i = n; i >= 1; i--) /// parcurg graful transpus invers
{
if(!verif2[aux[i]])
{
dfs_2(aux[i]);
k++;
}
}
cout << k - 1 << '\n';
for(int i = 1; i <= n; i++)
{
ans[i].first = i;
ans[i].second = verif2[i];
}
sort(ans + 1, ans + n + 1);
for(int i = 1; i <= n; i++)
{
if(ans[i].second != ans[i + 1].second)
cout << ans[i].first << "\n";
else
cout << ans[i].first << " ";
}
return 0;
}