AOV拓扑排序实验总结-1
AOV拓扑排序实验总结-1
实验数据:
1、实验输入数据在input.txt文件中
2、对于n是指有顶点n个,数据的结束标志是一行0 0。
1、实验输入数据在input.txt文件中
2、对于n是指有顶点n个,数据的结束标志是一行0 0。
实验目的:获取优秀的AOV排序算法模板
数据结构安排:
1、队列:负责记录入度为0且没有排序的AOV顶点
2、邻接表结点:邻接表结点采用自定义的复合结构,保存顶点信息、边表头指针。
3、邻接表边表:采取链表的形式存储数据
4、邻接表的数据类型是相同的,只是在概念上使得结点独特的保存了当前起始顶点
5、按照vertex的编号独立的使用一个数组indegree保存入度,一定程度的节省了空间
1、队列:负责记录入度为0且没有排序的AOV顶点
2、邻接表结点:邻接表结点采用自定义的复合结构,保存顶点信息、边表头指针。
3、邻接表边表:采取链表的形式存储数据
4、邻接表的数据类型是相同的,只是在概念上使得结点独特的保存了当前起始顶点
5、按照vertex的编号独立的使用一个数组indegree保存入度,一定程度的节省了空间
实验内容:1、算法模板的设计 2、算法类的设计或头文件封装的尝试
AOV算法模板要求:
1、假定AOV排序成立
2、vertex本身可以按照编号进行命名
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("\n"); 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:
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
运行正常
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("\n"); 94 return 0; 95 }