拓扑排序模板-每次找入度为0的点都循环每一个点

#include <iostream>

#include <cstdio>

#include <cstring>

#include <vector>

#define nMAX 510

using namespace std;

vector<int> g[nMAX];//每个点的链表

int have[nMAX];//存每个点的入度

int main()

{

    int i,j,k,n,m,x,y;

    bool o;

    while (~scanf(“%d%d”,&n,&m))

    {

        for (i = 1; i <= n; i++)//清空链表

        {

            g[i].clear();

        }

        memset(have, 0, sizeof(have));

        while (m–)

        {

            scanf(“%d%d”,&x,&y);

            g[x].push_back(y);//将y存到x的链表里面

            have[y]++;

        }

        for (i = 0, o = false; i < n; i++)//循环n次

        {

            for (j = 1; j <= n; j++)

            {

                if (have[j] == 0)

                {

                    o && printf(” “);

                    printf(“%d”,j);

                    o = true;

                    have[j] = -1;//删除j点

                    for (k = 0; k < g[j].size(); k++)//将g[j]链表里的所有的点的入度都减1

                    {

                        have[g[j][k]]–;

                    }

                    break;//每次找到一个就结束,并且总是在这个for循环之后加break,要每次找到之后才结束,不是每次循环直接结束。

                }

            }

        }

        printf(“\n”);

    }

    return 0;

}

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