Cod sursa(job #2343192)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 13 februarie 2019 19:16:47
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define MAX 100010

using namespace std;

int n,m,na,x,y,nrz;
int t1[MAX],t2[MAX],z[MAX],az[MAX];
bool acc[MAX];
vector<int> nd[MAX],ndi[MAX],nrv;
pair<int,int> v[MAX];
stack<int> s;

bool cmp(pair<int,int> nr1, pair<int,int> nr2){
  return nr1.second>nr2.second;
}
bool cmpz(int a1,int a2){
  return z[a1]<z[a2];
}
void dfs(int nod){
  z[nod]=nrz;
  for(auto i:ndi[nod])
    if(!z[i]){
      z[i]=nrz;
      dfs(i);
    }
}

int main()
{
    ifstream f ("ctc.in");
    ofstream g ("ctc.out");
    f>>n>>m;
    for(int i=1;i<=m;i++)
      f>>x>>y,
      nd[x].push_back(y),
      ndi[y].push_back(x);
    for(int i=n;i>=1;i--)nrv.push_back(i);
    s.push(1);
    for(int ta=1;ta<=2*n;){
      if(!s.size()){
        while(acc[nrv.back()])nrv.pop_back();
        s.push(nrv.back());
        continue;
      }
      na=s.top();
      if(t1[na]==0)t1[na]=ta++;
      acc[na]=1;
      while(nd[na].size()&&acc[nd[na].back()])
        nd[na].pop_back();
      if(nd[na].size()) s.push(nd[na].back());
      else {
        t2[na]=ta++;
        s.pop();
      }
    }
    for(int i=1;i<=n;i++)v[i]=make_pair(i,t2[i]),az[i]=i;
    sort(v+1,v+n+1,cmp);
    for(int i=1;i<=n;i++)
      if(!z[v[i].first]){
        nrz++;
        dfs(v[i].first);
      }
    g<<nrz<<'\n';
    sort(az+1,az+n+1,cmpz);
    for(int i=1;i<=n;i++)cout<<t2[i]<<" ";
    for(int i=1,za=1;za<=nrz;za++){
      for(;z[az[i]]==za;i++)g<<az[i]<<" ";
      g<<'\n';
    }
    f.close ();
    g.close ();
    return 0;
}