标签:cte using color void 图例 实现 apt stack aaaaaa
自己对拓扑排序的理解:
例如:安排一些课程的顺序,这些课程有的可以放在一个学期内授课,而有的则有先后顺序,则可以通过拓扑排序来完成这个排序。
有序无环图(DAG)才能进行拓扑排序。
从图中找出没有入度顶点,存入答案序列中,并将以该点为起点的边从图中删掉。知道找完所有的点为止。
图例:(从左往右看)
第一步:取出1点或者4点,并将对应的边删掉(这里先取1点,具体的顺序根据实际情况来)得
第二步:再取4点得
第三步:取2点得到
最后一步:取出3点来
答案:1 4 2 3
还是通过例题来看一下代码实现吧
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 }
标签:cte using color void 图例 实现 apt stack aaaaaa
原文地址:https://www.cnblogs.com/sykline/p/9737808.html