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

拓扑排序(TopologicalSort)算法

时间:2015-03-07 21:10:59      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

拓扑排序算法应用:

  有些事情做都需要按照流程的去做,比如你准备约你小女友去影院看速度与激情7大片,首先你想的是我怎么到达影院,然后达到影院,你可以先买票,或者等小女友来了一起买票,然后一起进电影大厅.....然后说说甜言蜜语时机成熟了有可以做下一步了;作为顶点:自己的位置,影院位置,小女友到达影院,买票,进大厅,作为顶点,比如都到达了影院买好票才可以一起进入,就是当一个顶点都被满足时才可以该顶点才可以做动作执行下一步。这是我自己的理解方式,你要还不理的话可能是我说的不够好!

 

  1 /*
  2     拓扑排序基本思想:
  3         1.查找原始图中入度为0的顶点都入栈。
  4         2.所有顶点都入栈后,在一个顶点一个顶点的出栈。
  5         3.出栈一个顶点若是有邻接表的话,该邻接表的顶点入度-1 = 0的话,
  6         该邻接表的顶点入栈,然后一直循环。。。
  7 */
  8 
  9 #include <stdio.h>
 10 #include <malloc.h>
 11 #include <stdlib.h>
 12 
 13 #define MAXVEX 14//最大顶点数
 14 #define MAXEDGE 20//最大边数
 15 
 16 /*    邻接矩阵结构    */
 17 typedef struct
 18 {
 19     int vexs[MAXVEX];//顶点下标
 20     int arc[MAXVEX][MAXVEX];//矩阵
 21     int numVertexes, numEdges;//当前图中的顶点数和边数
 22 
 23 }MGraph;
 24 
 25 /*    邻接表结构    */
 26 typedef struct EdgeNode
 27 {//边表结点
 28     int adjlist;//邻接点域,存储该顶点下标
 29     int weigth;//用于存储权值,对于无网图可以忽略
 30     struct EdgeNode *next;//链域,指向下一个邻接点域
 31 
 32 }EdgeNode;
 33 
 34 typedef struct
 35 {//顶点表结点
 36     int in;//顶点入度
 37     int data;//顶点域,存储顶点信息
 38     EdgeNode *firstedge;//边表头指针
 39 
 40 }VertexNode, AdjList[MAXVEX];
 41 
 42 typedef struct
 43 {
 44     AdjList adjlist;//顶点向量
 45     int numVertexes, numEdges;//当前图中顶点数和边数
 46 
 47 }graphAdjList,*GraphAdjList;
 48 
 49 /**********************************************************/
 50 
 51 /*    构件图    */
 52 void CreateMGraph(MGraph *G)
 53 {
 54     int i, j;
 55 
 56 //    printf("请输入顶点数和边数:\n");
 57     G->numVertexes = MAXVEX;
 58     G->numEdges    = MAXEDGE;
 59 
 60     //初始化顶点下标
 61     for(i=0; i<G->numVertexes; i++)
 62         G->vexs[i] = i;
 63 
 64     //初始化矩阵
 65     for(i=0; i<G->numVertexes; i++)
 66         for(j=0; j<G->numVertexes; j++)
 67             G->arc[i][j] = 0;
 68 
 69     //内置输入
 70     G->arc[0][4]  = 1;
 71     G->arc[0][5]  = 1; 
 72     G->arc[0][11] = 1; 
 73     G->arc[1][2]  = 1; 
 74     G->arc[1][4]  = 1; 
 75     G->arc[1][8]  = 1; 
 76     G->arc[2][5]  = 1; 
 77     G->arc[2][6]  = 1;
 78     G->arc[2][9]  = 1;
 79     G->arc[3][2]  = 1; 
 80     G->arc[3][13] = 1;
 81     G->arc[4][7]  = 1;
 82     G->arc[5][8]  = 1;
 83     G->arc[5][12] = 1; 
 84     G->arc[6][5]  = 1; 
 85     G->arc[8][7]  = 1;
 86     G->arc[9][10] = 1;
 87     G->arc[9][11] = 1;
 88     G->arc[10][13]= 1;
 89     G->arc[12][9] = 1;
 90 
 91     return ;
 92 }
 93 
 94 /*    采用矩阵-构建邻接表    */
 95 void CreateALGraph(MGraph G, GraphAdjList *GL)
 96 {
 97     int i, j;
 98     EdgeNode *e;
 99 
100     *GL = (GraphAdjList)malloc(sizeof(graphAdjList));
101     (*GL)->numVertexes = G.numVertexes;
102     (*GL)->numEdges = G.numEdges;
103 
104     for(i=0; i<G.numVertexes; i++)
105     {//初始化邻接表
106         (*GL)->adjlist[i].in = 0;
107         (*GL)->adjlist[i].data = G.vexs[i];
108         (*GL)->adjlist[i].firstedge = NULL;
109     }
110 
111     //建立邻接表
112     for(i=0; i<G.numVertexes; i++)
113         for(j=0; j<G.numVertexes; j++)
114             if(G.arc[i][j] == 1)
115             {//若存在关系
116                 e = (EdgeNode *)malloc(sizeof(EdgeNode));
117                 e->adjlist = j;
118                 e->next = (*GL)->adjlist[i].firstedge;
119                 (*GL)->adjlist[i].firstedge = e;//头插法
120                 (*GL)->adjlist[j].in ++;//该顶点入度+1
121             }
122 
123     return ;
124 }
125 
126 int TopologicalSort(GraphAdjList GL)
127 {/*    拓扑排序    */
128     EdgeNode *e;
129     int i, k, gettop;
130     int top = 0;//指向栈顶
131     int count = 0;//记数
132     int *stack;//建立一个栈
133     stack = (int *)malloc(GL->numVertexes * sizeof(int));
134 
135     //把没有入度的顶点入栈
136     for(i=0; i<GL->numVertexes; i++)
137         if(0 == GL->adjlist[i].in)
138             stack[++top] = i;
139 
140     while(top != 0)
141     {//若栈中有元素存在
142         gettop = stack[top--];//栈顶顶点的下表给gettop,然后top-1
143         printf("%d->", GL->adjlist[gettop].data);//打印出栈顶点信息
144         count++;
145 
146         for(e=GL->adjlist[gettop].firstedge; e; e=e->next)
147         {//判断出栈的顶点是否有出度
148             k = e->adjlist;//有则邻接点域顶点下标赋值K
149             if(!(--GL->adjlist[k].in))//该邻接点域的顶点入度-1(因为出栈的顶点已经指向该顶点,所以-1)后没有入度为0的话
150                 stack[++top] = k;//则该顶点入栈
151         }
152     }
153     printf("\n");
154     if(count < GL->numVertexes)
155         exit(-1);//若小于顶点数,证明存在环
156     else
157         return 0;
158 }
159 
160 int main(void)
161 {
162     MGraph G;
163     GraphAdjList GL;
164     CreateMGraph(&G);//构件图
165     CreateALGraph(G, &GL);//构建邻接表
166     TopologicalSort(GL);//拓扑排序
167     system("PAUSE");
168 
169     return 0;
170 }
171 
172 /*
173     在vc++6.0运行结果:
174     3->1->2->6->0->4->5->8->7->12->9->10->13->11->
175     请按任意键继续. . .
176 */

 

拓扑排序(TopologicalSort)算法

标签:

原文地址:http://www.cnblogs.com/bebug/p/4320877.html

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