鱼C论坛

 找回密码
 立即注册
查看: 3072|回复: 0

[学习笔记] 《数据结构与算法》——拓扑排序

[复制链接]
发表于 2017-8-20 16:55:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 luciferzf 于 2017-8-20 22:02 编辑

拓扑排序:
建立一个有向图,我们称之为AOV图。我们需要将AOV图中每个点进行排序,按照入度的多少的顺序。我们用栈结构来储存点,首先我们先将入度为0的点压入栈中,然后把压入栈中的点从AOV图中删除,与其相邻的点的度减一。
在代码实现的过程中,我们使用数组来储存每个点,用链表的方式来储存每个点的出度。当进行遍历的时候,我们将所有入度为0的点压入栈中,然后把改点的出度的点的入度减一。循环至所有点都被压入栈中。
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. using namespace std;

  5. int stack[1000];
  6. int N;

  7. class graph
  8. {
  9. public:
  10.         int low;
  11.         graph *np=NULL;
  12. };

  13. class VERTEX
  14. {
  15. public:
  16.         int power=0;
  17.         graph *np = NULL;
  18. };

  19. void Input(VERTEX vertex[])
  20. {
  21.         int a, b;
  22.         printf("input the edge of graph and end with double -1:\n");
  23.         cin >> a >> b;
  24.         graph *cp=NULL;
  25.         while (a != -1)
  26.         {
  27.                 if (vertex[a].np == NULL)
  28.                 {
  29.                         vertex[a].np = new graph;
  30.                         cp = vertex[a].np;
  31.                 }
  32.                 else
  33.                 {
  34.                         cp->np = new graph;
  35.                         cp = cp->np;
  36.                 }
  37.                 cp->low = b;
  38.                 vertex[b].power++;
  39.                 cin >> a >> b;
  40.         }
  41. }

  42. void print(VERTEX vertex[])
  43. {
  44.         for (int i = 0; i < N; i++)
  45.         {
  46.                 printf("%d",stack[i]);
  47.                 if (i != N-1)
  48.                 {
  49.                         printf("——>");
  50.                 }
  51.                 else
  52.                 {
  53.                         cout << endl;
  54.                 }
  55.         }
  56. }

  57. int main()
  58. {
  59.         int count=0;
  60.         cout << "input the numbers of the vertexes:";
  61.         cin >> N;
  62.         int edge=0;
  63.         cout<<"input the numbers of the edge:";
  64.         cin>>edge;
  65.         VERTEX vertex[edge];
  66.         Input(vertex);
  67.         graph *cp;
  68.         while (count < N)
  69.         {
  70.                 int precount = count;
  71.                 for (int i = 1; i <= N; i++)
  72.                 {
  73.                         if (vertex[i].power == 0)
  74.                         {
  75.                                 stack[count++] = i;
  76.                                 vertex[i].power = -1;
  77.                         }
  78.                 }
  79.                 while (precount != count)
  80.                 {
  81.                         cp = vertex[stack[precount]].np;
  82.                         while (cp != NULL)
  83.                         {
  84.                                 vertex[cp->low].power--;
  85.                                 cp = cp->np;
  86.                         }
  87.                         precount++;
  88.                 }
  89.         }
  90.         print(vertex);
  91.         system("PAUSE");
  92. }
复制代码

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表