如何求拓扑排序的所有种类及种类数
Posted xwh-blogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何求拓扑排序的所有种类及种类数相关的知识,希望对你有一定的参考价值。
输入:第一行为点数n和各连接边数m
接下来m行写某一条有向边的起始点和终止点
输出:拓扑排序所有方案和方案种数
sample input
9 10 0 1 1 3 2 4 3 2 3 6 5 4 6 5 7 5 8 6 8 7
sample output
0 1 3 2 8 6 7 5 4 0 1 3 2 8 7 6 5 4 0 1 3 8 2 6 7 5 4 0 1 3 8 2 7 6 5 4 0 1 3 8 6 2 7 5 4 0 1 3 8 6 7 2 5 4 0 1 3 8 6 7 5 2 4 0 1 3 8 7 2 6 5 4 0 1 3 8 7 6 2 5 4 0 1 3 8 7 6 5 2 4 0 1 8 3 2 6 7 5 4 0 1 8 3 2 7 6 5 4 0 1 8 3 6 2 7 5 4 0 1 8 3 6 7 2 5 4 0 1 8 3 6 7 5 2 4 0 1 8 3 7 2 6 5 4 0 1 8 3 7 6 2 5 4 0 1 8 3 7 6 5 2 4 0 1 8 7 3 2 6 5 4 0 1 8 7 3 6 2 5 4 0 1 8 7 3 6 5 2 4 0 8 1 3 2 6 7 5 4 0 8 1 3 2 7 6 5 4 0 8 1 3 6 2 7 5 4 0 8 1 3 6 7 2 5 4 0 8 1 3 6 7 5 2 4 0 8 1 3 7 2 6 5 4 0 8 1 3 7 6 2 5 4 0 8 1 3 7 6 5 2 4 0 8 1 7 3 2 6 5 4 0 8 1 7 3 6 2 5 4 0 8 1 7 3 6 5 2 4 0 8 7 1 3 2 6 5 4 0 8 7 1 3 6 2 5 4 0 8 7 1 3 6 5 2 4 8 0 1 3 2 6 7 5 4 8 0 1 3 2 7 6 5 4 8 0 1 3 6 2 7 5 4 8 0 1 3 6 7 2 5 4 8 0 1 3 6 7 5 2 4 8 0 1 3 7 2 6 5 4 8 0 1 3 7 6 2 5 4 8 0 1 3 7 6 5 2 4 8 0 1 7 3 2 6 5 4 8 0 1 7 3 6 2 5 4 8 0 1 7 3 6 5 2 4 8 0 7 1 3 2 6 5 4 8 0 7 1 3 6 2 5 4 8 0 7 1 3 6 5 2 4 8 7 0 1 3 2 6 5 4 8 7 0 1 3 6 2 5 4 8 7 0 1 3 6 5 2 4 sum:52
代码:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 int n,m; 6 int s[100][100]; 7 int visit[100]; 8 int indegree[100]; 9 int ans[100]; 10 int sum=0; //记录拓扑排序总数 11 void DFS(int num) 12 { 13 int i,j,k; 14 if (num==n) 15 { 16 sum++; 17 for (i=0;i<n;i++) 18 printf("%d ",ans[i]); 19 printf(" "); 20 return; 21 } 22 for (i=0;i<n;i++) 23 { 24 if ((!indegree[i])&&(!visit[i])) 25 { 26 for (j=0;j<n;j++) 27 if (s[i][j]) 28 indegree[j]--; 29 visit[i]=1; 30 ans[num]=i; 31 DFS(num+1); 32 for (k=0;k<n;k++)///回溯,恢复现场,将入度重新加一,并且将该顶点标记为未访问 33 if (s[i][k]) 34 indegree[k]++; 35 visit[i]=0; 36 } 37 } 38 return; 39 } 40 int main() 41 { 42 43 int a,b,i,j,num; 44 scanf("%d%d",&n,&m); 45 memset(indegree,0,sizeof(indegree)); 46 memset(s,0,sizeof(s)); 47 memset(visit,0,sizeof(visit)); 48 memset(ans,0,sizeof(ans)); 49 for (i=1;i<=m;i++) 50 { 51 scanf("%d%d",&a,&b); 52 s[a][b]=1; 53 indegree[b]++; 54 } 55 DFS(0); 56 cout<<"sum:"<<sum; 57 return 0; 58 59 }
以上是关于如何求拓扑排序的所有种类及种类数的主要内容,如果未能解决你的问题,请参考以下文章
BaoBao Loves Reading ZOJ - 4117 (思维/求区间不同种类数)