拓扑排序队列处理

#include <iostream>

#include <cstring>

#include <cstdio>

#include <queue>

using namespace std;

const int maxn=1e6+10;

int n,m,t;

int G[1000][1000],id[1000],topo[1000];

void toposort()

{

    queue<int> q;

    int t=0;

    for(int i=1;i<=n;i++)

        if(id[i]==0)

            q.push(i);//入度为零的放进队列

    while(!q.empty())

    {

        int u=q.front();

        q.pop();

        topo[t++]=u;//入度为零的就是排好的,拿出来

        for(int i=1;i<=n;i++)//这个循环用来删除拿出来的点和相连接的点的边

            if(G[u][i]!=0)

                if(–id[i]==0)

                    q.push(i);

    }

    printf(“%d”,topo[0]);

    for(int i=1;i<t;i++)

        printf(” %d”,topo[i]);

    printf(“\n”);

}

int main()

{

    while(scanf(“%d%d”,&n,&m) && (m!=0 || n!=0))

    {

        memset(G,0,sizeof(G));

        memset(id,0,sizeof(id));

        int a,b;

        for(int i=1;i<=m;i++)

        {

            scanf(“%d%d”,&a,&b);

            G[a][b]=1;

            id[b]++;//记录每个点的入度

        }

        toposort();

    }

    return 0;

}

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/alusang/article/details/79253323
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞