码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序

时间:2018-10-02 22:28:09      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:cte   using   color   void   图例   实现   apt   stack   aaaaaa   

自己对拓扑排序的理解:

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

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

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

图例:(从左往右看)

技术分享图片技术分享图片?技术分享图片技术分享图片?技术分享图片技术分享图片?技术分享图片技术分享图片?

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

第二步:再取4点得

第三步:取2点得到

最后一步:取出3点来

答案:1 4 2 3

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

确定比赛次序HDU-1285

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

技术分享图片
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 #include <stack>
 5 #include <cstdio>
 6 #include <string>
 7 #include <cstring>
 8 #include <sstream>
 9 #include <cmath>
10 #define INF 0x3f3f3f3f
11 #define mod 1000000007;
12 #define FRE() freopen("in.txt","r",stdin)
13 using namespace std;
14 const int maxn = 1001;
15 int mmap[maxn][maxn];
16 int indegree[maxn];
17 int n,m;
18 
19 inline void init()
20 {
21     memset(mmap, 0, sizeof(mmap));
22     memset(indegree, 0, sizeof(indegree));
23 }
24 
25 void topu()
26 {
27     priority_queue<int,vector<int>,greater<int> > que;
28     for(int i = 1; i <= n; i++)
29         if(indegree[i] == 0)
30             que.push(i);
31 
32     int cnt = 1;
33     while(!que.empty())
34     {
35         int u = que.top();
36         que.pop();
37         if(cnt == 1)
38         {
39             printf("%d",u);
40             cnt++;
41         }
42         else
43             printf(" %d",u);
44 
45         for(int i = 1; i <= n; i++)
46         {
47             if(mmap[u][i])
48             {
49                 indegree[i]--;
50                 if(indegree[i] == 0)
51                     que.push(i);
52             }
53         }
54 
55     }
56 }
57 
58 int main()
59 {
60     while(~scanf("%d%d",&n,&m))
61     {
62         init();
63         for(int i = 0; i < m; i++)
64         {
65             int st,en;
66             scanf("%d%d",&st,&en);
67             if(mmap[st][en]) continue;
68             mmap[st][en] = 1;
69             indegree[en]++;
70         }
71         topu();
72         printf("\n");
73     }
74     return 0;
75 }
View Code

 

拓扑排序

标签:cte   using   color   void   图例   实现   apt   stack   aaaaaa   

原文地址:https://www.cnblogs.com/sykline/p/9737808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!