拓扑排序 C++代码实现

#include <iostream> using namespace std; #define MAX 10000000 #define MAX_VERTEX_NUM 20 /*顺序栈的定义*/ #define Stack_Size 100 typedef struct sqStack { int *elem; int top; int stackSize;//栈数组长度 }sqStack; /*顺序栈的初始化*/ void initStack_Sq(sqStack &S) { S.elem=new int[Stack_Size]; S.top=-1; S.stackSize=Stack_Size; } /*入栈*/ void push(sqStack &S,int x) { if(S.top==Stack_Size-1) cout<<“Stack Overflow!”; S.elem[++S.top]=x; } /*出栈*/ int pop(sqStack &S) { int x; if(S.top==-1) cout<<“Stack Empty!”; x=S.elem[S.top–]; return x; } typedef struct EdgeNode {//边表结点的定义 int adjvex;//存放邻接点在顶点表中的位置 struct EdgeNode * nextedge;//指向下一个边表结点 }EdgeNode; typedef struct VexNode {//顶点表结点的定义 char vex;//存放顶点信息 EdgeNode * firstedge;//指向第一个边表结点 int indegree; }VexNode; typedef struct {//顶点表的定义 VexNode vexs[MAX_VERTEX_NUM]; int vexnum,edgenum; }LGraph; /*构造有向图的邻接表*/ void CreateDG_AL(LGraph &G,int n,int e) { int i,j,k; G.vexnum=n; G.edgenum=e; for(i=0;i<n;i++) { cin>>G.vexs[i].vex; G.vexs[i].firstedge=NULL;//初始化为空 } for(k=0;k<e;k++) { EdgeNode *p; cin>>i>>j; p=new EdgeNode; p->adjvex=j; p->nextedge=G.vexs[i].firstedge; G.vexs[i].firstedge=p;//采用头插法 } } //拓扑排序 void TopoSort(LGraph &G) { sqStack S; initStack_Sq(S); EdgeNode *p; int count=0; int i,j; for(i=0;i<G.vexnum;i++) G.vexs[i].indegree=0;//初始化为0 for(i=0;i<G.vexnum;i++) {//计算各个顶点的入度 p=G.vexs[i].firstedge; while(p) { G.vexs[p->adjvex].indegree++; p=p->nextedge; } } for(i=0;i<G.vexnum;i++) if(G.vexs[i].indegree==0) push(S,i);//将度为0的顶点入栈,这里进栈的是入度为0的顶点在数组中的位置 while(S.top!=-1) { j=pop(S); cout<<G.vexs[j].vex<<” “;//将栈顶的元素出栈且输出,即将入度为0的顶点输出 count++;//计数器加1 p=G.vexs[j].firstedge;//让p指向入度为0的顶点的第一个边表结点 while(p) { G.vexs[p->adjvex].indegree–;//将入度为0的顶点的邻接点的入度减1 if(G.vexs[p->adjvex].indegree==0) push(S,p->adjvex);//度减1后的顶点如果其入度为0,则将其入栈 p=p->nextedge; } } if(count<G.vexnum) cout<<“Network G has citcuits!”<<endl; } void main() { freopen(“in.txt”,”r”,stdin); LGraph G; CreateDG_AL(G,6,9); TopoSort(G); } 

在大一做实验课的时候,就看到实验室的墙上贴着很多图片,当时我很好奇的看那些图,可是就是看不懂,但我很深刻的记住了那是什么图,就是拓扑结构图,当时我就想,拓扑,好神奇的一个名字啊,肯定有深奥的知识在里面,感觉这个东西很神圣一样。现在我不仅懂了什么是拓扑,而且还可以自己把它的代码写出来,有了一点点的成就感,而更多的是我知道了一个一直在我心里却不知道它是一个什么东西的东西,呵呵,我挺开心的。虽然我知道拓扑的应用很广,我现在掌握的也只是它的表面,但由于现在我没有那么多时间去深研究它,但我以后再用到它的时候,我一定会好好研究一下它,现在还有很多的基础知识我没有掌握。数据结构我的感觉是越往后越复杂,越不容易理解,我得花很多时间在还没有懂的东西上,我得把他们都搞懂,然后再去一一深究他们!

 

“哎呦,代码谁教你的啊?”

“哎呦!我生下来就会啊,你不知道啊?”

“哎呦,PI 啊!”

PS:另外推荐一个让大家真正练手的网站:猪八戒威客网,在这里可以按自己的能力去接一些程序设计的任务。我觉得这是一种很不错的学习方法,当你接了别人的任务,无形中就给了自己压力和动力,然后就会主动的去查询资料,分析问题,可能会历经艰辛才能解决问题,但这中间的过程是很珍贵的,你会通过自己的努力学到很多课本上没有学到的东西,也能过一回需求分析的瘾,真实的体会到和客户进行交流的诸多“纠结”,最后,如果你的努力得到客户的认可,可以获得一笔小小的佣金,当做对自己的奖励,更重要的是,通过做任务,你能体会到自己存在的价值感和对自己能力的肯定!

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/hackerain/article/details/6048375
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞