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

    #include<iostream>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #define INF 0x3f3f3f3f
    const int maxn = 1e6 + 5;
    const double PI = acos(-1.0);
    typedef long long ll;
    using namespace std;
    
    int T, n, m, u, v, num;
    int InDeg[maxn];
    vector<int> vec[maxn];
    queue<int>q;
    
    bool topsort() {
        while (!q.empty())  q.pop();
        num = 0;
        for (int i = 1; i <= n; i++) if (!InDeg[i]) q.push(i);
        while (!q.empty()) {
            int now = q.front();
            q.pop();
            num++;
            for (int i = 0; i < vec[now].size(); i++) {
                if (--InDeg[vec[now][i]] == 0) q.push(vec[now][i]);    //入度为零,进入队列
                
            }
        }
        if (n == num)    return true;
        return false;
    }
    
    int main() {
        scanf("%d", &T);
        while (T--) {
            scanf("%d%d", &n, &m);   //n个点,m条边
            while (m--) {
                scanf("%d%d", &u, &v);
                vec[u].push_back(v);       //临接表存储
                InDeg[v]++;
            }
            if (topsort()) printf("Correct");
            else printf("Wrong");
        }
        return 0;
    }

      可以用DFS求出DAG的拓扑排序,如果排序失败,说明该图存在有向环,不是DAG

      UVA 10305 给任务排序

      

    John有n个任务要做,每个任务在做之前要先做特定的一些任务。

    输入第一行包含两个整数n和m,其中1<=n<=100。 n表示任务数,而m表示有m条任务之间的关系。 接下来有m行,每行包含两个整数i和j,表示任务i要在j之前做。

    当读入两个0(i=0,j=0)时,输入结束。

    输出包含q行,每行输出一条可行的安排方案。

      

    #include<iostream>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #define INF 0x3f3f3f3f
    const int maxn = 105;
    const double PI = acos(-1.0);
    typedef long long ll;
    using namespace std;
    
    int T, n, m, u, v, num;
    int InDeg[maxn];
    int topo[maxn];
    vector<int> vec[maxn];
    queue<int>q;
    int cnt;
    
    bool topsort() {
        while (!q.empty())  q.pop();
        num = 0;
        for (int i = 1; i <= n; i++) if (!InDeg[i])  q.push(i), topo[cnt++] = i;
        while (!q.empty()) {
            int now = q.front();
            q.pop();
            num++;
            for (int i = 0; i < vec[now].size(); i++) {
                if (--InDeg[vec[now][i]] == 0) q.push(vec[now][i]), topo[cnt++] = vec[now][i];    //入度为零,进入队列
    
            }
        }
        if (n == num)  return true;
        return false;
    }
    
    int main() {
        while (scanf("%d%d", &n, &m)!=EOF) { //n个点,m条边
            if (n == m && n == 0) break;
            cnt = 0;
            while (m--) {
                  scanf("%d%d", &u, &v);
                  vec[u].push_back(v);       //临接表存储
                  InDeg[v]++;
             }
             if (topsort()) {
                 printf("%d", topo[0]);
                 for (int i = 1; i < cnt; i++) printf(" %d", topo[i]);
            }
            else printf("Wrong");
             printf("\n");
            }
        return 0;
    }
    View Code

      

  • 相关阅读:
    唱歌循序渐进
    523法则
    南北朝鲜
    全名K歌
    《如何进行接口mock测试》
    vue动态添加路由,跳转页面时,页面报错路由重复:vue-router.esm.js?8c4f:16 [vue-router] Duplicate named routes definition: { name: "Login", path: "/login" }
    npm install -g 和npm install --save-dev的关系
    vue项目安装依赖项的时候总是报错
    聊聊 OAuth 2.0 的 Token 续期处理
    Spring Security OAuth 格式化 token 输出
  • 原文地址:https://www.cnblogs.com/hznumqf/p/12309351.html
Copyright © 2011-2022 走看看