Pagini recente » Cod sursa (job #1673293) | Cod sursa (job #2310360) | Cod sursa (job #2189603) | Cod sursa (job #2888468) | Cod sursa (job #3256855)
#include <bits/stdc++.h>
using namespace std;
int n, m, viz[100001], v[100001], len, nrctc;
vector<int> L[100001];
vector<int> G[100001]; /// graful transpus
int c[100001]; /// c[i]=j : nodul i face parte din comp. conexa j
int X[200001], Y[200001];
/// (X[i], Y[i]) este arc
vector<int> h[100001]; /// h - listele de adiacenta
/// pentru noul graf aciclic asociat c.t.c.
void NewGraph()
{
int i, j;
for (int p = 1; p <= m; p++)
{
i = X[p];
j = Y[p];
if (c[i] != c[j]) h[c[i]].push_back(c[j]);
}
for (i = 1; i <= nrctc; i++)
sort(h[i].begin(), h[i].end());
for (i = 1; i <= nrctc; i++)
if (h[i].size() > 0)
{
for (int e : h[i])
cout << e << " ";
cout << "\n";
}
else cout << "0\n";
}
void Citire()
{
int i, j;
cin >> n >> m;
for (int p = 1; p <= m; p++)
{
cin >> i >> j;
L[i].push_back(j);
G[j].push_back(i);
X[p] = i; Y[p] = j;
}
}
void DFS_TF(int k)
{
viz[k] = 1;
for (int i : L[k])
if (viz[i] == 0) DFS_TF(i);
v[++len] = k;
}
void SortTop()
{
for (int i = 1; i <= n; i++)
if (viz[i] == 0) DFS_TF(i);
}
/// DFS obisnuit pe arce inverse
void DFS(int k)
{
viz[k] = 1;
c[k] = nrctc;
for (int i : G[k])
if (viz[i] == 0) DFS(i);
}
void Kosaraju()
{
int i, k;
SortTop();
/// reinitializare
for (i = 1; i <= n; i++)
viz[i] = 0;
for (i = n; i >= 1; i--)
{
k = v[i];
if (viz[k] == 0)
{
nrctc++;
DFS(k);
}
}
}
int main()
{
Citire();
Kosaraju();
NewGraph();
return 0;
}