typedef struct ArcNode {
int adjvex;
struct ArcNode *nextarc;
int weight;
} ArcNode;
typedef struct {
int data;
int inDegree;
ArcNode *firstarc;
} AdjList[9];
typedef struct {
AdjList adjList;
int vexnum, arcnum;
} Graph;
void TopoSort(Graph *g) {
int count = 0;
Stack *stack = NULL;
stack = initStack(stack);
for (int i = 0; i < g->vexnum; ++i) {
if (g->adjList[i].inDegree == 0) {
enStack(stack, g->adjList[i].data);
}
}
ArcNode *arc = NULL;
printf("拓扑排序:");
while (!isEmptyStack(stack)) {
int vex = deStack(stack);
count++;
printf("%2d", g->adjList[vex].data);
arc = g->adjList[vex].firstarc;
while (arc) {
g->adjList[arc->adjvex].inDegree -= 1;
if (g->adjList[arc->adjvex].inDegree == 0) {
enStack(stack, g->adjList[arc->adjvex].data);
}
arc = arc->nextarc;
}
}
if (count < g->vexnum) {
printf("\n图中存在环");
} else {
printf("\n不存在环");
}
}
void KeyPath(Graph *g) {
int topo[g->vexnum];
int ve[g->vexnum];
int vl[g->vexnum];
int count = 0;
Stack *stack = NULL;
stack = initStack(stack);
for (int i = 0; i < g->vexnum; ++i) {
ve[i] = 0;
if (g->adjList[i].inDegree == 0) {
enStack(stack, g->adjList[i].data);
}
}
ArcNode *arc = NULL;
while (!isEmptyStack(stack)) {
int vex = deStack(stack);
topo[count++] = vex;
arc = g->adjList[vex].firstarc;
while (arc) {
if ((--(g->adjList[arc->adjvex].inDegree)) == 0) {
enStack(stack, arc->adjvex);
}
int start = vex;
int end = g->adjList[arc->adjvex].data;
if (ve[start] + arc->weight > ve[end]) {
ve[end] = ve[start] + arc->weight;
}
arc = arc->nextarc;
}
}
if (count < g->vexnum) {
printf("存在环\n");
return;
}
printf("topo:");
for (int i = 0; i < g->vexnum; ++i) {
printf("%4d", topo[i]);
}
printf("\nve:");
for (int i = 0; i < g->vexnum; ++i) {
printf("%4d", ve[i]);
}
for (int i = 0; i < g->vexnum; ++i) {
vl[i] = ve[count - 1];
}
while (count != 0) {
int start = topo[--count];
arc = g->adjList[start].firstarc;
while (arc) {
int end = arc->adjvex;
if (vl[start] > vl[end] - arc->weight) {
vl[start] = vl[end] - arc->weight;
}
arc = arc->nextarc;
}
}
printf("\nvl:");
for (int i = 0; i < g->vexnum; ++i) {
printf("%4d", vl[i]);
}
printf("\n关键路径:\n");
for (int i = 0; i < g->vexnum; ++i) {
arc = g->adjList[i].firstarc;
while(arc){
int start = g->adjList[i].data;
int end = g->adjList[arc->adjvex].data;
int ee = ve[start];
int el = vl[end] - arc->weight;
if(el == ee){
printf("(%d, %d)->%d\n", start, end, arc->weight);
}
arc = arc->nextarc;
}
}
}