TopoSort(拓扑排序)

其实说白了,拓扑排序就是一个广度优先搜索。

拓扑排序的方法如下:

  (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.

  (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.

  (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

 

本题目是采用的邻接表存储方法。

具体的实现是用vector数组。

题目:HDU 1285 http://acm.hdu.edu.cn/showproblem.php?pid=1285

 

View Code
#include "iostream"

#include "vector"

#include "queue"

using namespace std;



#define MAX 505

int InDeg[MAX];

int n, m, Count;

int Ans[MAX];



void TopoSort(vector<int> v[])

{

    priority_queue<int, vector<int>, greater<int> > PQ;

    for(int i=1; i<=n; i++) //找出入度为0的点并放入优先队列

        if(InDeg[i]==0) PQ.push(i);



    while(!PQ.empty()) //BFS

    {

        int Tmp = PQ.top();

        PQ.pop();

        Ans[Count++] = Tmp;

        for(int i=0; i<v[Tmp].size(); i++)

        {

            InDeg[v[Tmp][i]]--;

            if(InDeg[v[Tmp][i]]==0) PQ.push(v[Tmp][i]);

        }

    }

}



int main()

{

    int x, y;

    while(cin>>n>>m)

    {

        vector<int> V[MAX];

        memset(Ans, 0, sizeof(Ans));

        Count = 0;

        memset(InDeg, 0, sizeof(InDeg));

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

        {

            cin>>x>>y;

            InDeg[y]++;

            V[x].push_back(y);

        }

        TopoSort(V);

        for(int i=0; i<Count-1; i++) cout<<Ans[i]<<" ";

        cout<<Ans[Count-1]<<endl;

    }

}

你可能感兴趣的:(sort)