4 3 1 2 2 3 4 3
1 2 4 3
#include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
using namespace std;
const int maxn=500+5;
int du[maxn],a[maxn],tot;
vector <int> G[maxn];
int n,m;
    int u,v;
void topsort(int n)
{
     priority_queue<int,vector<int>,greater<int> > Q;
    for(int i=1;i<=n;i++)
            if(!du[i])    Q.push(i);
         tot=0;
        while(!Q.empty())
        {
             u=Q.top();
             Q.pop();
             a[++tot]=u;
            for(int i=0;i<G[u].size();i++)
            {
                v=G[u][i];
                du[v]--;
                if(!du[v])    Q.push(v);
            }
        }
}
int main()
{
    while(cin>>n>>m)
    {
        memset(du,0,sizeof(du));
        for(int i=1;i<=n;i++)
            G[i].clear();
        for(int i=0;i<m;i++)
        {
           scanf("%d%d",&u,&v);
             G[u].push_back(v);
            du[v]++;
        }
        topsort(n);
        for(int i=1;i<=n;i++)
        {
            if(i!=n)   printf("%d ",a[i]);
            else
                printf("%d",a[i]);
        }
        cout<<endl;
    }
    return 0;
}
原文:http://blog.csdn.net/u013514722/article/details/38398949