Pagini recente » Cod sursa (job #1702934) | Cod sursa (job #2740845) | Cod sursa (job #1486246) | Cod sursa (job #2227778) | Cod sursa (job #687979)
Cod sursa(job #687979)
#include <cstdio>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
#define NMAX 100005
int N, M;
vector<int> neigh[NMAX], neigh_T[NMAX];
void read_file(){
int a,b;
FILE * f = fopen("ctc.in", "rt");
fscanf(f, "%d %d", &N, &M);
for(int i = 0; i < M; ++i){
fscanf(f, "%d %d", &a, &b);
neigh[a].push_back(b);
neigh_T[b].push_back(a);
}
fclose(f);
}
vector<int> discovered, discovered1;
vector<int> finishednodes, ctc;
int nr_ctc = 0;
void dfs1(int node){
discovered[node] = 1;
for(unsigned i = 0; i < neigh[node].size(); ++i)
if(!discovered[neigh[node][i]])
dfs1(neigh[node][i]);
finishednodes.push_back(node);
}
void dfs2(int node){
ctc[node] = nr_ctc;
discovered1[node] = 1;
for(unsigned i = 0; i < neigh_T[node].size(); ++i)
if(!discovered1[neigh_T[node][i]])
dfs2(neigh_T[node][i]);
}
void dfs_1(){
discovered.resize(N+1);
for(int i = 1; i <= N; ++i)
if(!discovered[i])
dfs1(i);
}
void dfs_2(){
discovered1.resize(N+1);
ctc.resize(N+1);
for(int i = finishednodes.size() - 1; i >= 0; --i)
if(!discovered1[finishednodes[i]]){
++nr_ctc;
dfs2(finishednodes[i]);
}
//for(int i = 1; i <= N; ++i)
// printf("%d ", ctc[i]);
//printf("\n");
//printf("%d\n", nr_ctc);
}
void print(){
vector<int> comp[NMAX];
for(int i = 1; i <= N; ++i)
comp[ctc[i]].push_back(i);
FILE * f = fopen("ctc.out", "wt");
fprintf(f, "%d\n", nr_ctc);
for(int i = 1; i <= nr_ctc; ++i){
for(unsigned j = 0; j < comp[i].size(); ++j)
fprintf(f, "%d ", comp[i][j]);
fprintf(f, "\n");
}
fclose(f);
}
int main(){
read_file();
dfs_1();
dfs_2();
print();
return 0;
}