Cod sursa(job #1106411)

Utilizator oancea_horatiuOancea Horatiu oancea_horatiu Data 12 februarie 2014 19:56:04
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <vector>
#include <list>
using namespace std;

vector<pair<int,int> > graf[100005];
//pair <int,int> f[100005]; // first=timp terminare, second=nr. nod
int n,m,c;
bool check[100005]={0};
list <int> f; //finish times
vector <int> comp[100005];

void read(bool mode) // mode 1: read the graph; mode 0: read the transposed graph;
{
    ifstream d("ctc.in");
    d>>n>>m;
    for (int i=1;i<=m;i++)
    {
        int x,y;
        d>>x>>y;
        if (mode) graf[x].push_back(make_pair(x,y));
        else graf[y].push_back(make_pair(y,x));
    }
}

void dfs(int nod)
{
    vector <pair<int,int> >::iterator it;
    check[nod]=1;
    for (it=graf[nod].begin(); it!=graf[nod].end(); it++)
    {
        if (!check[(*it).second]) dfs((*it).second);
    }
    f.push_front(nod);
}

void standardDfss()
{
    for (int i=1;i<=n;i++)
    {
        if (!check[i])
        {
            dfs(i);
        }
    }
}

void resetGraf()
{
    for (int i=1;i<=n;i++) graf[i].clear();
    for (int i=1;i<=n;i++) check[i]=0;
}

void dfs2(int nod, int k)
{
    vector <pair<int,int> >::iterator it;
    check[nod]=1;
    for (it=graf[nod].begin(); it!=graf[nod].end(); it++)
    {
        if (!check[(*it).second]) dfs2((*it).second,k);
    }
    comp[k].push_back(nod);
}

void transposedDfss()
{
    list<int>::iterator il;
    int k=1;
    for (il=f.begin();il!=f.end();il++)
    {
        if (!check[*il])
        {
            dfs2(*il,k);
            k++;
        }
    }
    c=k-1;
}

void write()
{
    ofstream o("ctc.out");
    o<<c<<'\n';
    for (int i=1;i<=c;i++)
    {
        vector<int> ::iterator it;
        for (it=comp[i].begin(); it!=comp[i].end(); ++it) o<<(*it)<<' ';
        o<<'\n';
    }
}

int main()
{
    read(1);
    standardDfss();
    resetGraf();
    read(0);
    transposedDfss();
    write();
}