zoukankan      html  css  js  c++  java
  • Acwing-164-可达性统计(拓扑排序, 位运算统计)

    链接:

    https://www.acwing.com/problem/content/166/

    题意:

    给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。

    思路:

    先拓扑排序求出顺序, 再通过bitset利用位运算,记录并集, 可以解决重复计算的问题.

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 3e4+10;
    vector<int> G[MAXN];
    vector<int> Tup;
    bitset<30010> F[MAXN];
    int Dis[MAXN];
    int n, m;
    
    void Tupo()
    {
        queue<int> que;
        for (int i = 1;i <= n;i++)
        {
            if (Dis[i] == 0)
                que.push(i);
        }
        while (!que.empty())
        {
            int node = que.front();
            que.pop();
            Tup.push_back(node);
            for (int i = 0;i < G[node].size();i++)
            {
                int to = G[node][i];
                if (--Dis[to] == 0)
                    que.push(to);
            }
        }
    }
    
    void Solve()
    {
        for (int i = n-1;i >= 0;i--)
        {
            int x = Tup[i];
            F[x].reset();
            F[x][x] = 1;
            for (int k = 0;k < G[x].size();k++)
            {
                F[x] |= F[G[x][k]];
            }
        }
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        int u, v;
        for (int i = 1;i <= m;i++)
        {
            scanf("%d%d", &u, &v);
            G[u].push_back(v);
            Dis[v]++;
        }
        Tupo();
        Solve();
        for (int i = 1;i <= n;i++)
            printf("%d
    ", (int)F[i].count());
    
        return 0;
    }
    
  • 相关阅读:
    Java_多线程入门
    JAVA多线程基础(一)
    多线程1
    1.优化MySQL数据库
    廖胤松
    Mybatais
    Spring Boot入门
    MySQL的安装步骤详解
    MySQL入门
    WEB测试方法
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11531019.html
Copyright © 2011-2022 走看看