#include<stdio.h>
#include<stdlib.h>
typedef struct VexNode{
int adjvex;
int dut;
struct VexNode *next;
}VexNode;
typedef struct ENode{
int indegree;
int vertex;
int ee, el;
struct VexNode *link;
}ENode;
void print(ENode dig[], int first, int len){
int i, j;
static int top=0, list[50]; // static定义的变量在函数执行完成后不会被释放,下一次调用函数时,会保留上次的值继续使用
VexNode *q;
i = first;
q = dig[i].link;
list[top] = dig[i].vertex;
top++;
if(q == NULL){
printf("%d", list[len]);
for(i=1+len; i<top; i++){
printf("->%d", list[i]);
}
printf("\n");
}
while(q != NULL){
j = q->adjvex;
if(dig[j].ee == dig[j].el){ // 如果ve(j)=vl(j),则j为关键路径上的事件
list[top] = dig[j].vertex;
print(dig, j, len);
}
q = q->next;
}
top--;
}
int TopoSort(ENode dig[],int e_n,int stack[]){
int top=0, bottom=0, len=0;
int i, j;
VexNode *q;
for(int i=1; i<=e_n; i++){
// 入度为0的结点入栈
if(dig[i].indegree==0){
stack[top] = i;
top++;
}
}
len = top;
while(top > bottom){
i = stack[bottom];
q = dig[i].link;
bottom++; // 去除栈底结点
while(q != NULL){ // 栈底结点的所有邻接结点的入度减一,同时按拓扑排序计算ve(k)
j = q->adjvex;
dig[j].indegree--;
if(dig[i].ee + q->dut > dig[j].ee) // q->dut为边<i, j>的权值
dig[j].ee = dig[i].ee + q->dut;
if(dig[q->adjvex].indegree == 0){ // 如果此时结点j的入度为0,则入栈
stack[top] = q->adjvex;
top++;
}
q = q->next;
}
}
if(top == e_n){ // 按逆拓扑排序计算vl(k)
for(i=1; i<=e_n; i++){
dig[i].el = dig[stack[top-1]].ee;
}
bottom = 0;
while(bottom < top){
top--;
i = stack[top];
q = dig[i].link;
while(q != NULL){
j = q->adjvex;
if(dig[j].el - q->dut < dig[i].el)
dig[i].el = dig[j].el - q->dut;
q = q->next;
}
}
for(i=0; i<len; i++){
print(dig, stack[i], i);
}
return 0;
}else{
return 1;
}
}
int main(){
ENode dig[20];
VexNode *q;
char ch;
int e_n, v_n, sign, i, j, u, v, stack[20]; // stack中元素按图的拓扑排序存储
printf("请输入顶点个数和边的条数:");
scanf("%d%*c%d",&e_n,&v_n);
// 初始化图
for (i=1; i<=e_n; i++)
{
dig[i].indegree = 0;
dig[i].link = NULL;
dig[i].vertex = i;
dig[i].ee = dig[i].el = 0;
}
// 通过输入构造图
for (i=0; i<v_n; i++)
{
printf("请输入NO.%d条边的起始点以及该边的权:\n",i+1);
scanf("%d%*c%d%*c%d",&u,&v,&j);
q=(VexNode *)malloc(sizeof(VexNode));
dig[v].indegree++;
q->adjvex = v;
q->dut = j;
q->next = dig[u].link; // 头插法
dig[u].link = q;
}
sign = TopoSort(dig, e_n, stack);
if (sign)
printf("图中存在环,不存在关键路径\n");
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务