Pagini recente » Cod sursa (job #2641806) | Cod sursa (job #3037722) | Cod sursa (job #737388) | Cod sursa (job #2642111) | Cod sursa (job #2792917)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ifstream f("ctc.in");
ofstream g("ctc.out");
class Graph_Solver
{
int n, m, st, nr, scc;
vector<vector<int> > v, sol, tr;
vector<int> visited, dist, niv, low;
deque<int> d;
public:
void dfs(int nod)
{
visited[nod] = 1;
for(auto x : v[nod])
if(visited[x] == 0)
dfs(x);
if(scc == 1)
d.push_front(nod);
}
void dfs2(int nod)
{
sol[nr].push_back(nod);
visited[nod] = 1;
for(auto x : tr[nod])
if(visited[x] == 0)
dfs2(x);
}
void dfs_biconex(int dad, int nod)
{
visited[nod] = 1;
low[nod] = niv[nod];
d.push_back(nod);
for(int i = 0; i < v[nod].size(); ++i)
{
int vecin = v[nod][i];
if(vecin == dad)
continue;
if(visited[vecin])
{
low[nod] = min(low[nod], niv[vecin]);
continue;
}
niv[vecin] = niv[nod] + 1;
dfs_biconex(nod, vecin);
low[nod] = min(low[nod], low[vecin]);
if(low[vecin] >= niv[nod])
{
nr++;
int lst;
do
{
sol[nr].push_back(d.back());
lst = d.back();
d.pop_back();
}while(!d.empty() && lst != vecin);
sol[nr].push_back(nod);
}
}
}
void solve_biconex()
{
visited.resize(n+1);
niv.resize(n+1);
low.resize(n+1);
sol.resize(n+1);
for(int i = 1; i <= n; ++i)
visited[i] = niv[i] = low[i] = 0;
nr = 0;
dfs_biconex(0, 1);
g << nr << '\n';
for(int i = 1; i <= nr; g << '\n', ++i)
for(int j = 0; j < sol[i].size(); ++j)
g << sol[i][j] << " ";
}
void solve_scc()
{
visited.resize(n+1);
sol.resize(n+1);
tr.resize(n+1);
for(int i = 1; i <= n; ++i)
visited[i] = 0;
for(int i = 1; i <= n; ++i)
{
for(auto x : v[i])
tr[x].push_back(i);
}
nr = 0;
scc = 1;
for(int i = 1; i <= n; ++i)
if(!visited[i])
dfs(i);
for(int i = 1; i <= n; ++i)
visited[i] = 0;
scc = 2;
while(!d.empty())
{
int nod = d[0];
d.pop_front();
if(visited[nod] == 0)
{
++nr;
dfs2(nod);
}
}
g << nr << '\n';
for(int i = 1; i <= nr; g << '\n', ++i)
for(int j = 0; j < sol[i].size(); ++j)
g << sol[i][j] << " ";
}
void bfs()
{
dist.resize(n+1);
for(int i = 1; i <= n; ++i)
dist[i] = -1;
dist[st] = 0;
queue<int> q;
q.push(st);
while(!q.empty())
{
int nod = q.front();
q.pop();
for(auto x : v[nod])
{
if(dist[x] == -1)
{
dist[x] = dist[nod] + 1;
q.push(x);
}
}
}
for(int i = 1; i <= n; ++i)
g << dist[i] << " ";
g << '\n';
}
void citire(int pr, int tip)
{
f >> n >> m;
if(pr == 1)
f >> st;
v.resize(n+1);
visited.resize(n+1);
for(int i = 1; i <= n; ++i)
visited[i] = 0;
for(int i = 1; i <= m; ++i)
{
int a, b;
f >> a >> b;
v[a].push_back(b);
if(tip == 0) // undirected
v[b].push_back(a);
}
}
int conex()
{
int ans = 0;
for(int i = 1; i <= n; ++i)
if(visited[i] == 0)
dfs(i), ++ans;
return ans;
}
};
Graph_Solver gr;
int main()
{
gr.citire(0, 1);
gr.solve_scc();
return 0;
}