原创

: 课程先修问题,即AOV网和拓扑排序和深度优先搜索

课程先修问题,即AOV网和拓扑排序和深度优先搜索

在学习生活中常常有这样的问题,每门课程之间存在一定的先修关系,必须完成相应的课程才能毕业。 那么该以什么顺序完成呢。

#AOV网和拓扑排序
我们使用栈结构存储它的前驱为0的节点,每当有一个节点出栈,它的直接后驱的id号减一

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
141
142
143
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<opencv.hpp>
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace cv;
#define max 20
typedef struct ARCNODE{//边集
int adj;//第一条边
struct ARCNODE* nextarc;//下一条边
}ARC,*ARCPTR;
typedef struct vex {///点集
char vexdata;
int id;
ARCPTR firstadj;
}vexnode;

typedef struct graph {
vex ver[max];
int vexnum, arcnum;//点数 边数
}graph;
int visit[max];
void creat_graph(graph* G) {
ARC* p;
int i, j, k;
int v1, v2;
printf("\ninput vexnum");
scanf("%d", &G->vexnum);
getchar();
for (i = 1;i <= G->vexnum;i++) {
printf("input vexdata\n");
scanf("%c", &G->ver[i].vexdata);
getchar();
G->ver[i].id = 0;
G->ver[i].firstadj = NULL;

}
printf("\ninput arcnum");
scanf("%d", &G->arcnum);
for (i = 1;i <= G->arcnum;i++) {
printf("\ninput arc");
scanf("%d %d", &v1, &v2);

p = (ARC*)malloc(sizeof(ARC));
p->adj = v2;
p->nextarc = G->ver[v1].firstadj;
G->ver[v1].firstadj = p;
G->ver[v2].id++;
}
}
void sort(graph * G) {
int s[100];
int top = 0;
int i, j;
ARCPTR p;
for (i = 1;i <= G->vexnum;i++) {//top=0时为空
if (G->ver[i].id == 0) {
top++;s[top] = i;
}
}
while (top != 0) {
i = s[top--];
printf("%3c", G->ver[i].vexdata);
for (p = G->ver[i].firstadj;p != NULL;p = p->nextarc) {
j = p->adj;
G->ver[j].id--;
if (G->ver[j].id== 0) {
top++;
s[top] = j;
}
}
}

}
int first(graph* g,int i) {
int x;
ARC* p;
p = g->ver[i].firstadj;
if (p == NULL) {
return -1;
}
else{
return p->adj;
}
}
int next(graph* g, int i,int x) {
ARC* p;
p = g->ver[i].firstadj;
while (p->adj!= x) {
p = p->nextarc;
}
p = p->nextarc;
if (p == NULL) {
return -1;
}
else {
return p->adj;
}
}
void dfs(graph* g,int i) {
ARC* p;
int x;
if (visit[i] == 0) {
x = first(g, i);
visit[i] = 1;
printf("%d %c\n", i,g->ver[i].vexdata);
while (x!=-1) {
if(!visit[x])
dfs(g,x);
x = next(g, i,x);
}
}


}
void beforedfs(graph* g) {
int i, j;
for (i = 1;i <= g->vexnum;i++) {
if (visit[i] ==0)
{
dfs(g,i);
}

}
}

int main() {
graph* G=(graph*)malloc(sizeof(graph));
int j;
creat_graph(G);
printf("\n");
int i = 0;
for (i = 1;i <= G->vexnum;i++) {
visit[i] = 0;
}
sort(G);
printf("\n\n");
beforedfs(G);
}

[^1]但是若,该图存在环,会有部分无法输出

程序输出界面
程序输出界面