zoukankan      html  css  js  c++  java
  • 拓扑排序

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    using namespace std;
    #define N 505
    int ma[N][N],ans[N],indegree[N];
    int main()
    {
        int i,j,n,m;
        while(~scanf("%d %d",&n,&m))
        {
            memset(ma,0,sizeof(ma));
            memset(indegree,0,sizeof(indegree));
            while(m--)
            {
                int x,y;
                scanf("%d %d",&x,&y);
                if(!ma[x][y]) indegree[y]++;
                ma[x][y] = 1;
            }
            queue<int>q;
            int k = 0;
            for(i = 1; i <= n ; i++) if(indegree[i] == 0) {indegree[i]--;q.push(i);break;}
            while(!q.empty())
            {
                int cur = q.front();
                q.pop();
                ans[k++] = cur;
                for(i = 1 ; i <= n ; i++)
                {
                    if(ma[cur][i])
                    {
                        ma[cur][i] = 0;
                        indegree[i]--;
                    }
                }
                for(j = 1 ; j <= n ; j++) if(indegree[j] == 0) {indegree[j]--;q.push(j);break;}
            }
            for(i = 0 ; i <k ; i++)
                printf("%d%c",ans[i],i == k-1?'
    ':' ');
        }
    }
    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #include <vector>
    using namespace std;
    #define N 505
    int ans[N],indegree[N];
    int main()
    {
        int i,j,n,m;
        vector<int>e[N];
        while(~scanf("%d %d",&n,&m))
        {
            memset(e,0,sizeof(e));
            memset(indegree,0,sizeof(indegree));
            while(m--)
            {
                int x,y;
                scanf("%d %d",&x,&y);
                e[x].push_back(y);
                indegree[y]++;
            }
            queue<int>q;
            int k = 0;
            for(i = 1; i <= n ; i++) if(indegree[i] == 0) {indegree[i]--;q.push(i);break;}
            while(!q.empty())
            {
                int cur = q.front();
                q.pop();
                ans[k++] = cur;
                for(i = 0 ; i < e[cur].size() ; i++)
                        indegree[e[cur][i]]--;
                for(j = 1 ; j <= n ; j++) if(indegree[j] == 0) {indegree[j]--;q.push(j);break;}
            }
            for(i = 0 ; i <k ; i++)
                printf("%d%c",ans[i],i == k-1?'
    ':' ');
        }
    }
  • 相关阅读:
    JDK14的新特性:JFR,JMC和JFR事件流
    java深入理解浅拷贝和深拷贝
    jcmd:JDK14中的调试神器
    你真的了解java class name吗?
    JDK14中的java tools简介
    JDK 14的新特性:switch表达式
    JDK 14的新特性:文本块Text Blocks
    java中的内部类内部接口详解
    一文弄懂String的所有小秘密
    深入理解java的泛型
  • 原文地址:https://www.cnblogs.com/llei1573/p/3859905.html
Copyright © 2011-2022 走看看