#define ERROR 0; #define OK 1; #define Status int; typedefstruct { int vexnum; AdjList vex; /* data */ } ALGraph; typedefstruct { } Stack; typedefstructArcNode { int adjvex; int info; structArcNode *nextArc; } ArcNode;
typedefstructVNode { int data; structArcNode *firstArc; } VNode, AdjList[10];
Status TopologicalSort(ALGraph G) { int indegree[];//存储入度 Stack S; int counter = 0;//计数 判断是否有回路的依据 FindInDegree(G, indegree);// 获得入度 InitStack(S);
//寻找所有入度为0的顶点 for (int i = 0; i < G.vexnum; ++i) if (!indegree[i]) Push(S, i);
while (!StackEmpty(S)) { int k; Pop(S, k); printf("%d\t", k);//输出拓扑排序 ++counter; //删去所有以k为起点的边 for (ArcNode *p = G.vex[k].firstArc; p; p = p->nextArc) { int i = p->adjvex;//i为边p的终点 if (--indegree[i] == 0)//删去一条边 入度为0时入栈 Push(S, i); } }
int visited[]; voidDFSTraverse(ALGraph G) { for (int i = 0; i < G.vexnum; ++i) visited[i] = 0; for (int i = 0; i < G.vexnum; ++i) { if (!visited[i]) { DFS(G, i); } } }
voidDFS(ALGraph G, int i) { visited[i] = 1; for (int w = FirstNeighbor(G, i); w >= 0; w = NextNeighbor(G, w)) { if (!visited[w]) { DFS(G, w); } } printf(i); }
Status CriticalPath(ALGraph G) { InitStack(T);//T用于保存逆拓扑排序
if (!TopologicalSort(G,T)) { for (int i = 0; i < G.vexnum; ++i) vl[i] = ve[G.vexnum - 1];//很重要 int k; while (!StackEmpty(T)) { Pop(T, k); for (ArcNode *p = G.vex[k].firstArc; p; p = p->nextArc) { int i = p->adjvex; if ((vl[k] - p->info) < vl[i]) vl[i] = vl[k] - p->info; } }
for (int i = 0; i < G.vexnum; ++i) { for (ArcNode *p = G.vex[i].firstArc; p; p = p->nextArc) { int k = p->adjvex; int e = ve[i]; int l = vl[k] - p->info; if(e == l) printf("%d",i); } } } }