zoukankan      html  css  js  c++  java
  • UVA.10305 Ordering Tasks (拓扑排序)

    UVA.10305 Ordering Tasks

    题意分析

    详解请移步
    算法学习 拓扑排序(TopSort)

    拓扑排序的裸题
    基本方法是,indegree表示入度表,vector存后继节点。在topsort函数中,制造一个辅助队列,首先从入度表中找到入度为0的点作起点,并且置入度为-1。接着依次处理队列中的节点,首先根据他们的后继,将其后继节点的入度依次减1,若其后继节点中的入度存在-1的,说明成环,则不存在拓扑排序。紧接着再从入度表中找到入度为0的节点,加入到队列中,直到队列空。当退出while循环的时候,需要检查ans答案队列中是否已经有全部的节点,若其数量为n,则表明存在拓补排序,否则不存在。

    代码总览

    #include <iostream>
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <sstream>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <cmath>
    #define nmax 200
    #define MEM(x) memset(x,0,sizeof(x))
    using namespace std;
    vector<int> v[nmax];
    int indegree[nmax];
    int n;
    bool suc = true;
    queue<int> ans;
    void topsort()
    {
        queue<int> q;
        while(1){
            for(int i = 1; i<=n ;++i){
                if(indegree[i] == 0){
                    q.push(i);
                    ans.push(i);
                    indegree[i] = -1;
                }
            }
            if(q.empty()) break;
            while(!q.empty()){
                int t = q.front(); q.pop();
                for(int j = 0;j<v[t].size();++j){
                    int tt = v[t][j];
                    if(indegree[tt] == -1){
                        suc = false;
                        break;
                    }else indegree[tt]--;
                }
                v[t].clear();
                if(!suc) break;
            }
            if(!suc) break;
        }
        if(ans.size() <n){
            suc =false;
            return;
        }
    }
    void output()
    {
        bool isfirst = true;
        while(!ans.empty()){
            int t = ans.front(); ans.pop();
            if(isfirst){
                printf("%d",t);
                isfirst = false;
            }else
                printf(" %d",t);
        }
        printf("
    ");
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int m;
        while(scanf("%d%d",&n,&m) ==2 && (n||m)){
            MEM(indegree);
            suc = true;
            int a,b;
            for(int i = 0; i<m; ++i){
                scanf("%d%d",&a,&b);
                indegree[b]++;
                v[a].push_back(b);
            }
            topsort();
            if(suc) output();
            else printf("failed
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    ElasticSearch-生命周期管理
    Alpha 冲刺五
    Alpha 冲刺四
    Alpha 冲刺三
    Alpha 冲刺二
    Alpha 冲刺一
    测试随笔
    校友录
    项目需求分析(淘校)
    团队选题报告(淘校)
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367114.html
Copyright © 2011-2022 走看看