Pagini recente » Cod sursa (job #2027338) | Cod sursa (job #3174365) | Cod sursa (job #1306826) | Cod sursa (job #2773873) | Cod sursa (job #827116)
Cod sursa(job #827116)
#include <cstdio>
#include <vector>
#include <stack>
#include <fstream>
#define NMAX 100005
#define pb push_back
using namespace std;
int N, M, cnt;
vector<int> GD[NMAX], GT[NMAX], ind_comp, comp[NMAX];
stack<int> st;
bool viz[NMAX];
void read(void)
{
int x, y;
ifstream fin("ctc.in");
fin >> N >> M;
while(M--)
{
fin >> x >> y;
GD[x].pb(y);
GT[y].pb(x);
}
fin.close();
}
void DFSGD(int nod)
{
viz[nod] = 1;
for(int i = 0; i < GD[nod].size(); ++i)
if(!viz[GD[nod][i]])
DFSGD(GD[nod][i]);
st.push(nod);
}
void DFSGT(int nod, int indice)
{
ind_comp[nod] = indice;
for(int i = 0; i < GT[nod].size(); ++i)
if(ind_comp[GT[nod][i]] == -1)
DFSGT(GT[nod][i], indice);
}
void solve(void)
{
for(int i = 1; i <= N; ++i)
if(!viz[i])
DFSGD(i);
ind_comp.resize(N);
ind_comp.assign(ind_comp.size()+1, -1);
for(; !st.empty(); st.pop())
{
if(ind_comp[st.top()] == -1)
{
++cnt;
DFSGT(st.top(), cnt);
}
}
for(int i = 0; i < ind_comp.size(); ++i)
comp[ind_comp[i]].push_back(i);
}
void print(void)
{
ofstream fout("ctc.out");
fout << cnt << "\n";
for(int i = 1; i <= N; ++i)
{
for(int j = 0; j < comp[i].size(); ++j)
fout << comp[i][j];
fout << "\n";
}
fout.close();
}
int main(void)
{
read();
solve();
print();
}