Cod sursa(job #2341514)

Utilizator ewaldBerla Ewald ewald Data 11 februarie 2019 21:30:31
Problema Sortare topologica Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

using namespace std;

#define Nmax 50100

ifstream f("sortaret.in");
ofstream g("sortaret.in");

struct stack{
  long length;
  long elems[Nmax];

  void push( int x ){
    elems [++length] = x;
  }

  int pull(){
       length--;
       return elems [length+1];
   }

};

struct edges{
    long a;
    long b;
    bool visited = 0;
};

void read_data( edges e[], long &length, long &vertices ){
    f>>vertices>>length;
    for(int i=1; i<=length; i++)
        f>>e[i].a>>e[i].b;
}

int recursion( bool visited[],edges e[], long length ,int x,stack &s,int p){
    visited[x] = true;
    for(int i=p; i<=length; i++){
         if(x == e[i].a && !visited[e[i].b])
    recursion(visited,e,length,e[i].b,s,i);
    }
    s.push(x);
    return p;
}

void solve(bool visited[], edges e[], long length, long vertices, stack &s){
    int i,p=1;
    for(i=1; i<=vertices; i++)
            if(!visited[i]){
               p=recursion(visited,e,length,i,s,p);
            }
}

void print_data(stack s){
    while(s.length>=1){
        g<<s.pull()<<" ";
    }
}

int main()
{
    edges e[Nmax];
    long length,vertices;
    bool visited[Nmax] = {0};
    stack s;

    read_data(e,length,vertices);
    solve(visited,e,length,vertices,s);
    print_data(s);
}