Cod sursa(job #1468633)

Utilizator Liviu98Dinca Liviu Liviu98 Data 6 august 2015 16:09:16
Problema Sortare topologica Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <stdio.h>
#include <list>
#include <stack>
using namespace std;

class Graph
{
    int V;
    list<int> *adj;

    void TopologicalSort(int v,bool visited[],stack<int> &Stack);
public:
    Graph(int V);
    void AddEdge(int v,int w);
    void topologicalsort();
};

Graph::Graph(int V)
{
    this->V=V;
    adj=new list<int>[V];
}

void Graph::AddEdge(int node,int edge)
{
    adj[node].push_back(edge);
}

void Graph::TopologicalSort(int v,bool visited[] , stack<int> &Stack)
{
    visited[v]=true;
    for(list<int>::iterator it=adj[v].begin();it!=adj[v].end();it++)
        if(visited[*it]==false)
        TopologicalSort(*it,visited,Stack);
    Stack.push(v);
}

void Graph::topologicalsort()
{
    stack<int> Stack;
    bool *visited=new bool[V];
    for(int i=0;i<=V;i++)
        visited[i]=false;

    for(int i=0;i<V;i++)
        if(visited[i]==false)
        TopologicalSort(i,visited,Stack);

    freopen("sortaret.out","w",stdout);
    while(Stack.empty()==false)
    {
        if(Stack.top()!=0)
        printf("%d ",Stack.top());
        Stack.pop();
    }
}

int main()
{
    int N,M,x,y;
    freopen("sortaret.in","r",stdin);
    scanf("%d%d",&N,&M);
    Graph graf(N+1);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d",&x,&y);
        graf.AddEdge(x,y);
    }
    graf.topologicalsort();
}