自己对拓扑排序的理解:
例如:安排一些课程的顺序,这些课程有的可以放在一个学期内授课,而有的则有先后顺序,则可以通过拓扑排序来完成这个排序。
有序无环图(DAG)才能进行拓扑排序。
从图中找出没有入度顶点,存入答案序列中,并将以该点为起点的边从图中删掉。知道找完所有的点为止。
图例:(从左往右看)




第一步:取出1点或者4点,并将对应的边删掉(这里先取1点,具体的顺序根据实际情况来)得
第二步:再取4点得
第三步:取2点得到
最后一步:取出3点来
答案:1 4 2 3
还是通过例题来看一下代码实现吧
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;
}

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

被折叠的 条评论
为什么被折叠?



