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

如何求拓扑排序的所有种类及种类数

时间:2020-04-17 18:35:52      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:方案   i++   排序   并且   size   mamicode   com   bsp   code   

技术图片

输入:第一行为点数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("\n");
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   }

 

如何求拓扑排序的所有种类及种类数

标签:方案   i++   排序   并且   size   mamicode   com   bsp   code   

原文地址:https://www.cnblogs.com/xwh-blogs/p/12721648.html

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