Cod sursa(job #2127849)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 11 februarie 2018 09:51:42
Problema Sortare topologica Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int n, m;
vector<int> vecini[50005];
int grad[50005];
int viz[50005];
queue<int> Q;

void citire(){
    scanf("%d %d", &n, &m);

    int tmp1, tmp2;

    for(int i = 0; i < m; i++){
        scanf("%d %d", &tmp1, &tmp2);

        tmp1--;
        tmp2--;

        vecini[tmp1].push_back(tmp2);
        grad[tmp2]++;
    }
}

void addToQueue(){
    for(int i = 0; i < n; i++){
        if(grad[i] == 0 && viz[i] == false){
            Q.push(i);
            viz[i] = true;
        }
    }
}

void solve(){
    addToQueue();

    while(!Q.empty()){
        int x = Q.front();
        printf("%d ", x + 1);
        Q.pop();

        int l = vecini[x].size();

        for(int i = 0; i < l; i++){
            if(viz[vecini[x][i]] == false){
                grad[vecini[x][i]]--;

                if(grad[vecini[x][i]] == 0){
                    Q.push(vecini[x][i]);
                    viz[vecini[x][i]] = true;
                }
            }
        }
    }
}

int main()
{
    freopen("sortaret.in", "r", stdin);
    freopen("sortaret.out", "w", stdout);

    citire();
    solve();

    return 0;
}