Wednesday, October 31, 2012

Topological Sort

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define siz 1000005
vector <int> vec[siz];
vector <int> ans;
bool color[siz];
int node,edge;

void dfs(int n){
    color[n]=true;
    for(int i=0;i<vec[n].size();i++){
        int v=vec[n][i];
        if(!color[v]){
            dfs(v);
        }
    }
    ans.push_back(n);
}

void reset(){
    for(int i=0;i<=node;i++){
        color[i]=false;
        vec[i].clear();
    }
}
int main()
{
    int u,v;
    freopen("input.txt","r",stdin);
    while(scanf("%d%d",&node,&edge)==2){
        reset();
        for(int i=0;i<edge;i++){
            scanf("%d%d",&u,&v);
            vec[u].push_back(v);
        }

        for(int i=1;i<=node;i++){
            if(!color[i]){
                dfs(i);
            }
        }

        reverse(ans.begin(),ans.end());

        for(int i=0;i<ans.size();i++){
            if(i) printf(" ");
            printf("%d",ans[i]);
        }

    }
    return 0;
}

No comments:

Post a Comment