/**
*2018.9.30 15:28
*Topological
*拓扑排序,用于关键路径的算法中,判断是否有环
*/
#include<stdio.h>
#define MAX 100
typedef struct ArcNode{
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct Vertex {
char e;
ArcNode *first;
}Vertex;
typedef struct AdjList{
Vertex v[MAX];
int e_num, v_num;
}AdjList;
void findInDegree(AdjList *g, int inDegree[]);
int topSort(AdjList *g);
int main(void) {
putchar('\n');
system("pause");
return 0;
}
void findInDegree(AdjList *g, int inDegree[]) {
int i, j;
for (i = 0; i < g->v_num; ++i)
inDegree[i] = 0;
for (i = 0; i < g->v_num; ++i) {
ArcNode *p = g->v[i].first;
while (p != NULL){
inDegree[p->adjvex] += 1;
p = p->next;
}
}
}
int topSort(AdjList *g) {
int stack[MAX], inDegree[MAX], top = -1, i, count = 0;
findInDegree(g, inDegree);
for (i = 0; i < g->v_num; ++i)
if (inDegree[i] == 0)
stack[++top] = i;
ArcNode *p;
while (top != -1) {
i = stack[top--];
++count;
p = g->v[i].first;
while (p != NULL) {
--inDegree[p->adjvex];
if(inDegree[p->adjvex] == 0 )
stack[++top] = p->adjvex;
p = p->next;
}
}
if (count == g->v_num)
return 1;
else return 0;
}
拓扑排序
最新推荐文章于 2022-07-12 21:36:19 发布