书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

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;
    }
}

posted on 2012-04-11 18:36  More study needed.  阅读(948)  评论(0编辑  收藏  举报

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!