-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTopologic_sort.cpp
More file actions
141 lines (119 loc) · 3.3 KB
/
Topologic_sort.cpp
File metadata and controls
141 lines (119 loc) · 3.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/********************************************************************
Time: 2015/11/11
Filename: Topologic_sort
Author: dinglj
Purpose: topologic_sort,无环有向图
时间复杂度:邻接矩阵O(n ^ 2), 邻接表O(n + e)
*********************************************************************/
#include <iostream>
#include <stdio.h>
using namespace std;
//////////////////////////////////////////////////////////////////////
// 邻接矩阵实现
#define INF 65536
#define MAXSIZE 20
//////////////////////////////////////////////////////////////////////
// 邻接矩阵
typedef struct
{
int no;
char info;
// 新添加 节点入度,
// 也可以不改变VertexType,新建一个辅助存储结构存储节点入度
// 节点入度的计算可以在创建有向图的时候计算,也可以创建好图之后在计算。
int inDegree;
}VertexType;
typedef struct
{
int weight;
}EdgeType;
typedef struct
{
VertexType v[MAXSIZE];
EdgeType e[MAXSIZE][MAXSIZE];
int vertexNum;
int edgeNum;
}MGraph;
//////////////////////////////////////////////////////////////////////
/********************************************************************
Method: Topologic_sort
Parameter:
Returns:
Purpose: 拓扑排序,邻接矩阵实现
*********************************************************************/
// 辅助存储结构,存储每一个顶点的入度。也可以存储在VertexType中。
// int inDegree[MAXSIZE];
// InitGraph,初始化图
void InitGraph(MGraph &G)
{
for (int i = 0; i < MAXSIZE; ++i)
{
for (int j = 0; j < MAXSIZE; ++j)
{
G.e[i][j].weight = 0;
}
G.v[i].inDegree = 0; // 初始化入度
}
}
// CreateGraph,建立图的时候统计顶点的入度
void CreateGraph(MGraph &G)
{
cin >> G.vertexNum;
cin >> G.edgeNum;
for (int edgeNo = 0; edgeNo < G.edgeNum; ++edgeNo)
{
int start, end;
int weight = 1; // 有向图的边权值为1
cin >> start >> end;
G.e[start][end].weight = weight;
G.v[end].inDegree++; // 计算入度
}
}
//////////////////////////////////////////////////////////////////////
// Topologic_sort
bool Topologic_sort(MGraph G)
{
int vertexNum = 0; // 如果最终vertexNum == G.vertexNum,说明无环;若vertexNum < G.vertexNum,则有环
int stack[MAXSIZE], top = -1; // 辅助存储结构,暂时存储入度为0的顶点;也可用队列,随机数组等等
// 存储入度为0的顶点
for (int vertexNo = 0; vertexNo < G.vertexNum; ++vertexNo)
{
if (0 == G.v[vertexNo].inDegree)
{
top++;
stack[top] = vertexNo;
}
}
// 存储结构不空
while (-1 != top)
{
// 找出一个入度为0的顶点
int vertex = stack[top];
top--;
cout << vertex;
vertexNum++; //
// 将其邻接点的入度减去1
// 邻接矩阵和邻接表实现差别主要在这个for循环
for (int adjvex = 0; adjvex < G.vertexNum; ++adjvex)
{
if (1 == G.e[vertex][adjvex].weight)
{
G.v[adjvex].inDegree--;
// 存储入度为0的顶点
if (0 == G.v[adjvex].inDegree)
{
top++;
stack[top] = adjvex;
}
}
}
}
if (vertexNum == G.vertexNum)
{
return true;
}
else // 若有环,则vertexNum < G.vertexNum
{
return false;
}
}