• 算法竞赛模板 拓扑排序


    ①链式前向星版本:

    #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;
    } 
  • 相关阅读:
    js中Frame框架的属性获取(1)
    c#中文件上传(1)
    表单验证Validform
    Mybatis语法笔记
    js的checkbox
    调用微信Js-SDK支付
    调用微信Js-SDK图片
    java后台上传到linux
    web服务器内层溢出
    SpringMVC
  • 原文地址:https://www.cnblogs.com/kannyi/p/9413451.html
Copyright © 2020-2023  润新知