Pagini recente » Cod sursa (job #2767161) | Cod sursa (job #921628) | Cod sursa (job #1514074) | Cod sursa (job #1371770) | Cod sursa (job #2766857)
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
#include <vector>
#include <string>
std::ifstream fin("ctc.in");
std::ofstream fout("ctc.out");
std::list<int> adj[100001];
std::list<int> adj2[100001];
int nr_comp = 0;
void dfs(int source, bool *visited) {
visited[source] = true;
fout << source << " ";
for (auto it = adj2[source].begin(); it != adj2[source].end(); ++it) {
if (!visited[*it]) {
dfs(*it, visited);
}
}
}
void fillOrder(int source, bool *visited, std::stack<int>& stack) {
visited[source] = true;
for (auto it = adj[source].begin(); it != adj[source].end(); ++it) {
if (!visited[*it]) {
fillOrder(*it, visited, stack);
}
}
stack.push(source);
}
int main(void) {
// read inputs
int n, m, nr_comp = 0;
fin >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y;
fin >> x >> y;
adj[x].push_back(y);
// transpose graph
adj2[y].push_back(x);
}
// k algorithm
std::stack<int> stack;
bool visited[n];
for (int i = 1; i <= n; ++i) {
visited[i] = false;
}
for (int i = 1; i <= n; ++i) {
if (!visited[i]) {
fillOrder(i, visited, stack);
}
}
for (int i = 1; i <= n; ++i) {
visited[i] = false;
}
while (!stack.empty()) {
int top = stack.top();
stack.pop();
if (visited[top] == false) {
++nr_comp;
dfs(top, visited);
fout << "\n";
}
}
fin.close();
fout.close();
std::ofstream temp("temp.out");
std::ifstream fout("ctc.out");
std::string line;
while (!fout.eof()) {
while(getline(fout,line)){
temp << line << "\n";
}
}
temp.close();
fout.close();
std::ifstream temp2("temp.out");
std::ofstream fout2("ctc.out");
fout2 << nr_comp << "\n";
while (!temp2.eof()) {
while(getline(temp2,line)){
fout2 << line << "\n";
}
}
temp2.close();
fout2.close();
std::remove("temp.out");
return 0;
}