Pagini recente » Cod sursa (job #2041535) | Cod sursa (job #2353739) | Cod sursa (job #2663303) | Cod sursa (job #710755) | Cod sursa (job #2932586)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ctc.in");
ofstream g("ctc.out");
vector<vector<int>> graph; // lista de adiacenta pt graf
vector<vector<int>> graph_t; // lista de adiacenta pt graful transpus
int index=1; //numarul de comp tari conexe
stack <int> S; // stiva in care vom pune rezolvarea
queue <int> Q; // coada care ne va ajuta sa afisam in ordinea corecta rezultatul (intai nr si apoi componentele)
vector<int> visited;
// Implementam algoritmul lui Kosaraju cu doua dfs-uri (primul pe lista de adiacenta grafului,
// iar a doua pe cea a grafului transpus
void DFS_t(vector<vector<int>> graph_t, int n, int x, int index){
visited[x] = index;
for(int i = 0; i < graph_t[x].size(); i ++){
if(visited[graph_t[x][i]] == 0){
DFS_t(graph_t, n, graph_t[x][i], index);
}
}
S.push(x);
}
void DFS(vector<vector<int>> graph, int n, int x){
visited[x] = index;
for(int i = 0; i < graph[x].size(); i ++){
if(visited[graph[x][i]] == 0){
DFS(graph, n, graph[x][i]);
}
}
S.push(x);
}
int main() {
int n, m;
f >> n >> m;
graph.resize(n+1);
graph_t.resize(n+1);
visited.resize(n+1);
for(int i = 0; i < m; i ++){
int x, y;
f >> x >> y;
graph[x].push_back(y);
graph_t[y].push_back(x);
}
for(int i = 1; i <= n;i ++){
if(visited[i] == 0){
DFS(graph, n, i);
}
}
for(int i = 1; i <= n; i ++){ // reinitializam vectorul de vizitat ca sa putem aplica al 2-lea dfs
visited[i] = 0;
}
while(!S.empty()){
int x=S.top();
S.pop();
if(visited[x] == 0){
DFS_t(graph_t, n, x, index);
for(int i = 1; i <= n; i++){
if(visited[i] == index){
Q.push(i); // bagam raspunsul intr-o coada
}
}
Q.push(-1); // pentru endl;
index += 1;
}
}
g << index - 1 << endl; // afisam nr de comp tari conexe
while(!Q.empty()){ // afisam din coada creata anterior componentele conexe
int x=Q.front();
Q.pop();
if (x != -1)
g << x << " "; // afisam in fisierul ctc.out
else
g << endl;
}
return 0;
}
// Complexitate: O(n + m) = de la dfs