acwing 848. 有向图的拓扑序列

  • 针对有向无环图的拓扑排序
  • 构建图时记录每个点的入度
  • 入度为零的点入队列,再带入其指向的点
  • 与cur相连的点入度减一,可能有其他点同j相连
  • 故待其入度减为零时才入队列
const int N = 1e5 + 10;
int h[N], e[N], ne[N], d[N];
int n, m, idx = 0;
vector<int> ret;
void add(int a, int b)
{
    e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
void topsort()
{
    queue<int> m_next;
    
    for(int i = 1; i <= n; ++i)
    {
        if(d[i] == 0) // 入度为零的点入队列,再带入其指向的点
        {
            m_next.push(i);
        }
    }
    while(m_next.size())
    {
        int cur = m_next.front();
        ret.push_back(cur);
        m_next.pop();
        
        for(int i = h[cur]; i != -1; i = ne[i])
        {
            int j = e[i];
            d[j]--;         // 与cur相连的点入度减一
            if(d[j] == 0)   // 可能有其他点同j相连,
            {               // 待其入度减为零时入队列
                m_next.push(j);
            }
        }
    }
}
int main()
{
    memset(h, -1, sizeof(h));
    cin >> n >> m;
    int a, b;
    for(int i = 0; i < m; ++i)
    {
        cin >> a >> b;
        add(a, b);
        d[b]++; // 记录每个点的入度
    }
    topsort();
    if(ret.size() == n)
        for(auto &x : ret)
            cout << x << " ";
    else
        cout << -1;
    return 0;
}

你可能感兴趣的:(算法,数据结构)