AOV拓扑排序实验总结-1

AOV拓扑排序实验总结-1
 
实验数据:
1、实验输入数据在input.txt文件中
2、对于n是指有顶点n个,数据的结束标志是一行0 0。
 
实验目的:获取优秀的AOV排序算法模板
 
数据结构安排:
1、队列:负责记录入度为0且没有排序的AOV顶点
2、邻接表结点:邻接表结点采用自定义的复合结构,保存顶点信息、边表头指针。
3、邻接表边表:采取链表的形式存储数据
4、邻接表的数据类型是相同的,只是在概念上使得结点独特的保存了当前起始顶点
5、按照vertex的编号独立的使用一个数组indegree保存入度,一定程度的节省了空间
 
实验内容:1、算法模板的设计 2、算法类的设计或头文件封装的尝试
 
AOV算法模板要求:
1、假定AOV排序成立
2、vertex本身可以按照编号进行命名
 
构建的邻接表展现:
代码如下:
 1 for(int i=0;i<n;i++)
 2     {
 3         printf("vertex %d indegree %d points to:",aim[i].vertex,indegree[i]);
 4         point* temp=&aim[i];
 5         while(temp->next!=NULL)
 6         {
 7             temp=temp->next;
 8             printf("%d ",temp->vertex);
 9         }
10         printf("
");
11     }
展示情况:
vertex 0 indegree 0 points to:8 2
vertex 1 indegree 0 points to:2 4
vertex 2 indegree 2 points to:3
vertex 3 indegree 2 points to:5 7 9 10
vertex 4 indegree 1 points to:6
vertex 5 indegree 1 points to:
vertex 6 indegree 1 points to:10
vertex 7 indegree 1 points to:
vertex 8 indegree 1 points to:9 3
vertex 9 indegree 2 points to:
vertex 10 indegree 2 points to:
总体模板运行结果:
  0  1  8  2  4  3  6  5  7  9 10
运行正常
 
实验代码:
 1 //算法模板的设计
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<malloc.h>
 5 #include<cstring>
 6 #include<queue>
 7 #include<algorithm>
 8 using namespace std;
 9 const int maxn = 30;
10 struct point
11 {
12     int vertex;//顶点
13     point* next;
14 };
15 
16 int indegree[maxn];
17 point aim[maxn];
18 int n;
19 
20 int readin()
21 {
22     scanf("%d",&n);
23     memset(indegree,0,sizeof(int)*n);
24     for(int i=0;i<n;i++)
25     {
26         aim[i].next=NULL;
27         aim[i].vertex=i;
28     }
29     //初始化
30     int a,b;
31     while(scanf("%d%d",&a,&b))
32     {//a->b
33         if(a==0&&b==0)break;
34         indegree[b]++;//入度加1
35         point* temp=&aim[a];
36         while(temp->next!=NULL)temp=temp->next;
37         //找到存有指向结点链表的末端
38         temp->next=(point*)malloc(sizeof(point));
39         temp=temp->next;//进入新的point点
40         temp->vertex=b;//a->b
41         temp->next=NULL;
42     }//完成邻接表的构建
43     return 0;
44 }
45 
46 queue<int> psd;
47 int topo_sort(int* ans)
48 {
49     bool ok[maxn];
50     memset(ok,false,sizeof(ok));
51     int cur=0;
52     int num=n;
53     while(1)
54     {
55         if(num)
56         {
57             for(int i=0;i<n;i++)
58             {
59                 if(ok[i])continue;
60                 if(indegree[i]==0)
61                 {
62                     psd.push(i);
63                     ok[i]=true;
64                     num--;
65                 }
66             }//检查所有入度0的顶点并入队,留下入队标记
67         }
68         if(psd.empty())break;//队列为空则排序结束
69         int p=psd.front();psd.pop();
70         point* temp=&aim[p];
71         ans[cur++]=p;//也可以写成ans[cur++]=aim[i].vertex;
72         //提出结点并排序
73         while(temp->next!=NULL)
74         {
75             temp=temp->next;
76             indegree[temp->vertex]--;
77         }//去掉相关有向边
78     }
79     return 0;
80 }
81 
82 int ans[maxn];
83 int main()
84 {
85     //freopen("input.txt","r",stdin);
86     //freopen("ans.txt","w",stdout);
87     readin();
88     topo_sort(ans);
89     for(int i=0;i<n;i++)
90     {
91         printf("%3d",ans[i]);
92     }
93     printf("
");
94     return 0;
95 }
原文地址:https://www.cnblogs.com/savennist/p/12287905.html