拓扑排序

本文介绍拓扑排序的概念及其应用场景,以课程安排为例说明如何通过拓扑排序解决有依赖关系的任务排序问题。文章还提供了一个使用C++实现的具体示例代码。

自己对拓扑排序的理解:

例如:安排一些课程的顺序,这些课程有的可以放在一个学期内授课,而有的则有先后顺序,则可以通过拓扑排序来完成这个排序。

有序无环图(DAG)才能进行拓扑排序。

从图中找出没有入度顶点,存入答案序列中,并将以该点为起点的边从图中删掉。知道找完所有的点为止。

图例:(从左往右看)

第一步:取出1点或者4点,并将对应的边删掉(这里先取1点,具体的顺序根据实际情况来)得

第二步:再取4点得

第三步:取2点得到

最后一步:取出3点来

答案:1 4 2 3

还是通过例题来看一下代码实现吧

确定比赛次序HDU-1285

PS:注意重边的输入会导致边的入度发生改变这里要做一下处理。

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <cmath>
#define INF 0x3f3f3f3f
#define mod 1000000007;
#define FRE() freopen("in.txt","r",stdin)
using namespace std;
const int maxn = 1001;
int mmap[maxn][maxn];
int indegree[maxn];
int n,m;

inline void init()
{
    memset(mmap, 0, sizeof(mmap));
    memset(indegree, 0, sizeof(indegree));
}

void topu()
{
    priority_queue<int,vector<int>,greater<int> > que;
    for(int i = 1; i <= n; i++)
        if(indegree[i] == 0)
            que.push(i);

    int cnt = 1;
    while(!que.empty())
    {
        int u = que.top();
        que.pop();
        if(cnt == 1)
        {
            printf("%d",u);
            cnt++;
        }
        else
            printf(" %d",u);

        for(int i = 1; i <= n; i++)
        {
            if(mmap[u][i])
            {
                indegree[i]--;
                if(indegree[i] == 0)
                    que.push(i);
            }
        }

    }
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int i = 0; i < m; i++)
        {
            int st,en;
            scanf("%d%d",&st,&en);
            if(mmap[st][en]) continue;
            mmap[st][en] = 1;
            indegree[en]++;
        }
        topu();
        printf("\n");
    }
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值