zoukankan      html  css  js  c++  java
  • 算法竞赛模板 拓扑排序

    ①链式前向星版本:

    #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;
    } 
  • 相关阅读:
    centos7 安装redis服务及phpredis扩展
    centos7 LANMP 安装
    php reids 单机命令
    浅谈正向代理和反向代理
    php-fpm日志告警"seem busy"
    PHP-redis中文文档
    Nginx配置文件nginx.conf中文详解
    生成带参数的微信二维码
    微信临时二维码时为32位非0整型
    [Linux]Service mysql start出错(mysql: unrecognized service)解决方法
  • 原文地址:https://www.cnblogs.com/kannyi/p/9413451.html
Copyright © 2011-2022 走看看