君陌橙 2019-12-22 20:50 采纳率: 0%
浏览 296

用c语言版写的求解关键路径,调试到一半按任意键继续就关了,求大神看看我的代码

c语言版写的求解关键路径,调试到一半按任意键继续就关了,求大神看看我的代码,大一刚学 只能到建立完邻接表

``
#include < stdio.h>
#include< stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
#define MVNum 100 //最大顶点
#define NUM 10000 //最大边数
typedef int SElemType;
typedef int Status;
typedef char VerTexType;
typedef int Status;
typedef struct ArcNode //邻接表存储表示
{
int adjvex; //顶点所在位置
int weight; //权值
struct ArcNode *nextarc; //链域 (指向下一条边结点)
}ArcNode;
typedef struct VNode
{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct
{
AdjList vertices; //邻接表
int vexnum,arcnum; //图的当前顶点数和边数
}ALGraph;
typedef struct //定义栈
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
SqStack S;
int indegree[MVNum]; ///用数组indegree来存放各顶点的入度
int ve[NUM]; //事件发生最早的时间
int vl[NUM]; //事件发生最迟的时间
int topo[MVNum];

//初始化
void InitStack(SqStack S)
{
S->base=(SElemType
)malloc(sizeof MAXSIZE);
if(!S->base)
return ;
S->top=S->base;
S->stacksize=MVNum;
}
//入栈
void Push(SqStack S,SElemType e)
{
if(S->top-S->base==S->stacksize)
return ;
*S->top++=e;
}
//出栈
void Pop(SqStack *S,SElemType e)
{
if(S->top==S->base)
return ;
e=
--S->top;
}
//判断是否为空
Status StackEmpty(SqStack *S)
{
if(S->top==S->base)
return OK;
else
return ERROR;
}
int LocateVex(ALGraph G,VerTexType v)
{
int i;
for(i=0;i<G.vexnum;++i)
if(v==G.vertices[i].data)
return i;
return -1;
}

int CreateUDG(ALGraph *G) ////建立邻接表
{
ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode));
int i,k;
printf("请输入总的顶点数:");
scanf("%d",&G->vexnum);///图的顶点数
printf("请输入总的边数:");
scanf("%d",&G->arcnum);///图的边数
for(i=0;ivexnum;++i)
{
printf("请输入每个顶点的值:");
scanf("%d",&G->vertices[i].data);
G->vertices[i].firstarc=NULL; //顶点的第一个指针域为空
}
for(k=0;karcnum;++k)
{
int v1,v2;
int i,j,w;
printf("请依次输入起点 权值 终点(空格分开):");
scanf("%d %d %d",&v1,&w,&v2);
i=LocateVex(*G,v1);
j=LocateVex(*G,v2);
p->adjvex=j; //顶点
p->nextarc=G->vertices[i].firstarc;
G->vertices[i].firstarc=p; //有向图
p->weight=w;////权值
}
return OK;
}

void FindInDegree(ALGraph G,int indegree[]) //把顶点的入度放到数组中
{
int i,t;
ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc));

for(i=0;i {
t=0;
//使p指向第一个邻接点
if(p){
while(p){
p=p->nextarc; //p指向下一个邻接点
t++; //有指向的话 就加一
}
}
indegree[i]=t;
}
}

////拓扑排序
int TopologicalSort(ALGraph G,int topo[])
{
int i,m;
FindInDegree(G,indegree); //各顶点的入度
InitStack(&S); //初始栈
for(i=0;i if(!indegree[i]) //如果没有前驱的话
Push(&S,i); //进栈 (等于图中没有那个顶点了)
m=0;//计数
while(!StackEmpty(&S))
{
ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc));
Pop(&S,i);//出栈
topo[m]=i;
++m;
p=G.vertices[i].firstarc;
while(p!=NULL)
{
int k;
k=p->adjvex;
--indegree[k];
if(indegree[k]==0) //就剩一个了 直接入栈
Push(&S,k) ;
p=p->nextarc;
}
}
if(m<G.vexnum)
return ERROR; //拓扑排序不能有回路
else
return OK;

}

////关键路径
int CriticalPath(ALGraph G)
{
int n,i,k,j,e,l;
ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc));
if(!TopologicalSort(G,topo))
return ERROR;
n=G.vexnum;
for(i=0;i {
ve[i]=0; //最早发生的时间初值为零
}
for(i=0;i {
k=topo[i];
p=G.vertices[k].firstarc; //p指向第一个邻接点
while(p!=NULL)
{
j=p->adjvex;
if(ve[j]weight)
ve[j]=ve[k]+p->weight; ///最早发生时间更新
p=p->nextarc;///p指向下一个邻接点
}
}

for(i=0;i<n;i++)
{
    vl[i]=ve[n-1];   //最迟发生时间初值
}
for(i=n-1;i>=0;i--)
{
    k=topo[i];
    p=G.vertices[k].firstarc;   //p指向第一个邻接点
    while(p!=NULL)
    {
        j=p->adjvex;   //邻接点的序号
        if(vl[k]<vl[j]-p->weight)
            vl[k]=vl[j]-p->weight;  ///最迟发生时间更新
        p=p->nextarc;///p指向下一个邻接点
    }
}
///判断是否为关键活动
printf("关键路径:");
for(i=0;i<n;i++)
{
    ArcNode *p=(ArcNode *)malloc(sizeof(G.vertices[i].firstarc));
    p=G.vertices[i].firstarc;
        while(p!=NULL)
    {
        j=p->adjvex;    //顶点的位置
        e=ve[i];
        l=vl[j]-p->weight;
        if(e==1)
            printf("<v%d,v%d>",G.vertices[i].data,G.vertices[j].data);
             printf("为关键路径");
          p=p->nextarc;
        }
}
return OK;

}
int main()
{
ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph));
CreateUDG(G);
TopologicalSort(*G,topo);
CriticalPath(*G);
return 0;
}`

  • 写回答

1条回答

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题