生活随笔
收集整理的這篇文章主要介紹了
大话数据结构:拓扑排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基礎介紹
對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊<u,v>∈E(G),則u在線性序列中出現在v之前。
拓撲排序時的圖結構:
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXEDGE 20
#define MAXVEX 14
#define INFINITY 65535typedef int Status
;
typedef struct
{int vexs
[MAXVEX
];int arc
[MAXVEX
][MAXVEX
];int numVertexes
, numEdges
;
}MGraph
;
typedef struct EdgeNode
{int adjvex
; int weight
; struct EdgeNode
* next
;
}EdgeNode
;typedef struct VertexNode
{int in
; int data
; EdgeNode
* firstedge
;
}VertexNode
, AdjList
[MAXVEX
];typedef struct
{AdjList adjList
;int numVertexes
, numEdges
;
}graphAdjList
, * GraphAdjList
;
void CreateMGraph(MGraph
* G
)
{int i
, j
;G
->numEdges
= MAXEDGE
;G
->numVertexes
= MAXVEX
;for (i
= 0; i
< G
->numVertexes
; i
++){G
->vexs
[i
] = i
;}for (i
= 0; i
< G
->numVertexes
; i
++){for (j
= 0; j
< G
->numVertexes
; j
++){G
->arc
[i
][j
] = 0;}}G
->arc
[0][4] = 1;G
->arc
[0][5] = 1;G
->arc
[0][11] = 1;G
->arc
[1][2] = 1;G
->arc
[1][4] = 1;G
->arc
[1][8] = 1;G
->arc
[2][5] = 1;G
->arc
[2][6] = 1;G
->arc
[2][9] = 1;G
->arc
[3][2] = 1;G
->arc
[3][13] = 1;G
->arc
[4][7] = 1;G
->arc
[5][8] = 1;G
->arc
[5][12] = 1;G
->arc
[6][5] = 1;G
->arc
[8][7] = 1;G
->arc
[9][10] = 1;G
->arc
[9][11] = 1;G
->arc
[10][13] = 1;G
->arc
[12][9] = 1;}
void CreateALGraph(MGraph G
, GraphAdjList
* GL
)
{int i
, j
;EdgeNode
* e
;*GL
= (GraphAdjList
)malloc(sizeof(graphAdjList
));(*GL
)->numVertexes
= G
.numVertexes
;(*GL
)->numEdges
= G
.numEdges
;for (i
= 0; i
< G
.numVertexes
; i
++) {(*GL
)->adjList
[i
].in
= 0;(*GL
)->adjList
[i
].data
= G
.vexs
[i
];(*GL
)->adjList
[i
].firstedge
= NULL; }for (i
= 0; i
< G
.numVertexes
; i
++) {for (j
= 0; j
< G
.numVertexes
; j
++){if (G
.arc
[i
][j
] == 1){e
= (EdgeNode
*)malloc(sizeof(EdgeNode
));e
->adjvex
= j
; e
->next
= (*GL
)->adjList
[i
].firstedge
; (*GL
)->adjList
[i
].firstedge
= e
; (*GL
)->adjList
[j
].in
++;}}}}
Status
TopologicalSort(GraphAdjList GL
)
{EdgeNode
* e
;int i
, k
, gettop
;int top
= 0; int count
= 0;int* stack
; stack
= (int*)malloc(GL
->numVertexes
* sizeof(int));for (i
= 0; i
< GL
->numVertexes
; i
++)if (0 == GL
->adjList
[i
].in
) stack
[++top
] = i
;while (top
!= 0){gettop
= stack
[top
--];printf("%d -> ", GL
->adjList
[gettop
].data
);count
++; for (e
= GL
->adjList
[gettop
].firstedge
; e
; e
= e
->next
){k
= e
->adjvex
;if (!(--GL
->adjList
[k
].in
)) stack
[++top
] = k
;}}printf("\n");if (count
< GL
->numVertexes
)return ERROR
;elsereturn OK
;
}int main(void)
{MGraph G
;GraphAdjList GL
;int result
;CreateMGraph(&G
);CreateALGraph(G
, &GL
);result
= TopologicalSort(GL
);printf("result:%d", result
);return 0;
}
總結
以上是生活随笔為你收集整理的大话数据结构:拓扑排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。