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

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

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   More study needed.  阅读(949)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2012年4月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

导航

统计

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

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

点击右上角即可分享
微信分享提示