算法竞赛模板 拓扑排序

①链式前向星版本:

#include<bits/stdc++.h> 
using namespace std; 
#define INF 0x3f3f3f3f 
#define maxSize 1005
int n,m,cn,head[maxSize],in[maxSize],rec[maxSize]; 
struct edge{
    int to,next;
}e[maxSize*maxSize];
void add(int x,int y)
{
    e[++cn].next=head[x];
    e[cn].to=y;
    head[x]=cn;
}
void TopSort()
{
    int k=1,i;
    //priority_queue<int,vector<int>,greater<int> >st;
    stack<int>st; 
    for(i=1;i<=n;i++)
        if(!in[i])
            st.push(i);
    while(!st.empty())
    {
        int u=st.top();
        st.pop();
        rec[k++]=u;
        for(i=head[u];i!=-1;i=e[i].next)
        {
            int x=e[i].to;
            in[x]--;
            if(!in[x])
                st.push(x);
        }
    }
}
int main()
{
    int i,x,y;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(in,0,sizeof(in));
        memset(head,-1,sizeof(head));
        memset(rec,0,sizeof(rec));
        cn=0;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,y);
            in[y]++;
        }
        TopSort();
        for(i=1;i<=n;i++)
            if(i==1)printf("%d",rec[i]);
            else printf(" %d",rec[i]);
        cout<<endl;
    }
}

②vector邻接表版本:

#include<bits/stdc++.h>
#define MAX 505
using namespace std;
int in[MAX],n,m;
vector<int>to[MAX];
void topsort()
{
    queue<int>qu;
    int i,sum=0;
    for(i=1;i<=n;i++) 
        if(in[i]==0)
            qu.push(i);

    while(!qu.empty())
    {
        int a=qu.front();
        qu.pop();
        
        sum++;
        if(sum==1)cout<<a;
        else cout<<" "<<a;
        
        for(i=0;i<to[a].size();i++)
        {
            int v=to[a][i];
            in[v]--;
            if(in[v]==0)
                qu.push(v);
        }
    }
    cout<<endl;
} 
void init()
{
    memset(in,0,sizeof(in));
    for(int i=0;i<=MAX;i++)
        to[i].clear();
} 
int main()
{
    ios::sync_with_stdio(false);
    int u,v,i;
    while(cin>>n>>m)
    {
        init();
        for(i=1;i<=m;i++)
        {
            cin>>u>>v;
            to[u].push_back(v);
            in[v]++;
        } 
        topsort();
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/kannyi/p/9413451.html