基本思路是:从AOV网中选择一个入度为0的顶点并输出,然后删除此顶点,并删除以此顶点为尾的狐,直到图中不存在入度为0的点,
这里用代码实现的方法是:先让入度为0的点都入栈,当栈不为0的时候,出栈,出栈的时候打印出栈的顶点,并将该顶点所指向的顶点的入度减一。
#include <iostream>
using namespace std;
#define maxSize 100
typedef struct ArcNode {
int adjvex; //该边指向的顶点
int weight; //边上的权值
struct ArcNode * next; //该顶点指向的下一条边
} ArcNode;
typedef struct Node {
int in; //表示入度
int data; //顶点信息
ArcNode * firstarc;
};
typedef struct {
Node nodes[maxSize];
int n, e; //n表达顶点数,e表示边数
}AGraph;
bool topologicalSort(AGraph * G) {
int stack[maxSize]; //定义一个栈
int top = -1;
int count = 0;
for (int i = 0; i < G->n; i++) {
if (G->nodes[i].in == 0) {
stack[++top] = i; //入栈
}
}
while (top > 0) {
int flag = stack[top--]; //出栈
cout << G->nodes[flag].data << "->"; //打印这个节点
count++;
for (ArcNode * arc = G->nodes[flag].firstarc; arc;arc=arc->next) {
G->nodes[arc->adjvex].in--; //入度减一
if (G->nodes[arc->adjvex].in == 0) {
stack[++top] = arc->adjvex;//入度为0继续入栈
}
}
}
if (count < G->n) { //count<顶点数,证明有一部分顶点没有入栈计算,也就证明存在环。
return false;
}
return true;
}
int main() {
return 0;
}