关键路径-为什么第一个程序不能正常运行

问题描述

为什么第一个程序不能正常运行

/*******************************************************************************************/
//c语言关键路径第一种
#include
#include

typedef struct arcnode
{
??? int adjvex;?? //活动末端
??? struct arcnode *nextarc;
??? double info;??? //活动持续时间
}arcnode;

typedef struct vnode
{
??? int data;???? //事件名
??? arcnode *firstarc;
??? int du;??? //入度
}vnode;

typedef struct
{
??? int vexnum;
??? int actnum;
??? vnode *program;
}AOE;

//建立AOE网
void create(AOE T)
{
??? int i,start,end;
??? double time;
??? arcnode p;
??? T.program=(vnode *)malloc(T.vexnum*sizeof(vnode));
??? if(!T.program)
??????? exit(0);
??? for(i=0;i<T.vexnum;i++)
??? {
??????? T.program[i].data=i;
??????? T.program[i].du=0;
??????? T.program[i].firstarc=NULL;
??? }
??? printf("该项目的开始到结束在图中的点的输入 i,j,info ");
??? printf("如:4,5,9回车表示第四节点到第五节点之间的活动用了9个单位时间 ");
??? for(i=0;i<T.actnum;i++)
??? {
??????? scanf("%d,%d,%lf",&start,&end,&time);
??????? p=(arcnode
)malloc(sizeof(arcnode));
??????? p->adjvex=end-1;
??????? T.program[end-1].du++;
??????? p->info=time;
??????? p->nextarc=T.program[start-1].firstarc;
??????? T.program[start-1].firstarc=p;
??? }
}

//找关键路径
void crtical_activity(AOE T)
{
??? int stack=(int)malloc((T.vexnum+1)*sizeof(int));
??? double ve=(double)malloc(T.vexnum*sizeof(double));?? //储存事件最早发生时间
??? double vl=(double)malloc(T.vexnum*sizeof(double)) ;??? //储存事件最晚发生时间
??? double e=(double)malloc(T.actnum*sizeof(double));????? //存储活动最早发生时间
??? double l=(double)malloc(T.actnum*sizeof(double));????? //储存活动最晚发生时间
??? int i,j,k,top=0,bottom=0;
??? arcnode *p;
??? double sumtime=0.0;
??? for(i=0;i
??? {
??????? if(T.program[i].du==0)
??????? {
??????????? stack[top++]=i;
??????? }
??? }
??? while(top!=bottom)
??? {
??????? i=stack[bottom++];
??????? p=T.program[i].firstarc;
??????? while(p)
??????? {
??????????? k=p->adjvex;
??????????? T.program[k].du--;
??????????? if(T.program[k].du==0)
??????????? {
??????????????? stack[top++]=k;
??????????? }
??????????? if(ve[k]info)
??????????? {
??????????????? ve[k]=ve[i]+p->info;
??????????? }
??????????? p=p->nextarc;
??????? }
??? }
??? sumtime=ve[T.vexnum-1];
??? for(i=0;i
??? {
??????? vl[i]=ve[T.vexnum-1];
??? }
??? for(i=T.vexnum;i>=0;i--)
??? {
??????? int k=stack[i];
??????? p=T.program[k].firstarc;
??????? while(p)
??????? {
??????????? j=p->adjvex;
??????????? if(vl[j]-p->info
??????????? {
??????????????? vl[k]=vl[j]-p->info;
??????????? }
??????????? p=p->nextarc;
??????? }
??? }
??? printf("|起点|终点|最早开始时间|最迟开始时间|差|判断| ");
??? i=0;
??? for(j=0;j
??? {
??????? p=T.program[j].firstarc;
??????? while(p)
??????? {
??????????? int k=p->adjvex;
??????????? e[++i]=ve[j];
??????????? l[i]=vl[k]-p->info;
??????????? printf("|%4d|%4d|%lf|%lf|%lf|",T.program[j].data+1,T.program[k].data+1,e[i],l[i],l[i]-e[i]);
??????????? if(l[i]==e[i])
??????????? {
??????????????? printf("关键活动| ");
??????????? }
??????????? printf(" ");
??????????? p=p->nextarc;
??????? }
??? }
??? printf("整个工程所用的最短时间为: %lf个单位时间 ",sumtime);
}

int? main()
{
??? AOE t;
??? printf("请输入AOE网的事件个数:? ");
??? scanf("%d",&t.vexnum);
??? printf("请输入AOE网的活动个数:? ");
??? scanf("%d",&t.actnum);
??? create(t);
??? crtical_activity(t);
??? return 0;
}

/****************************************************************************************************/
//第二种
/*
#include "stdio.h"
#include "stdlib.h"
#define MAX 50
typedef struct ArcNode
{
int adjvex;
int info;//权值
struct ArcNode *nextarc;
}ArcNode;

typedef struct Vnode
{
char data;
int inDegree;
ArcNode *link;
}Vnode,AdjList[MAX+1];

typedef struct
{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;

void CreateGraph(ALGraph &G)
{
int i,j,s,d,w;
ArcNode p;
ArcNode *t;
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("第%d个结点信息(char)型:",i);
scanf("%c",&G.vertices[i].data);
G.vertices[i].inDegree=0;
G.vertices[i].link=NULL;
}
for(i=0;i<G.arcnum;i++)
{
printf("第%d条边----起点序号,终点序号,权值:",i);
scanf("%d %d %d",&s,&d,&w);
p=(ArcNode
)malloc(sizeof(ArcNode));
p->adjvex=d;
p->info=w;
p->nextarc=G.vertices[s].link;
G.vertices[s].link=p;
}
for(i=0;i
{
int counter=0;
for(j=0;j
{
if (j!=i)
{
t=G.vertices[j].link;
while (t)
{
if (t->adjvex==i)
{
counter++;

}
t=t->nextarc;
}
}
}
G.vertices[i].inDegree=counter;
}
}

void OutputGraph(ALGraph &G)
{
int i;
ArcNode *p;
printf("遍历图的结果如下: ");
for(i=0;i
{
printf("[%c(%d)]",G.vertices[i].data,G.vertices[i].inDegree);
p=G.vertices[i].link;
while (p!=NULL)
{
printf("---->%d",p->adjvex);
p=p->nextarc;
}
printf(" ");
}
}

int ve[MAX+1]={0};
int stack2[MAX+1];
int top2=0;

void TopologicalOrder(ALGraph &G)
{
int stack[MAX+1];

ArcNode *p;
int i,top=0,k;
for(i=0;i
if (G.vertices[i].inDegree==0)
{
stack[top++]=i;
}
int count=0;
while (top>0)
{
i=stack[--top];
stack2[top2++]=i;
//printf("(%d,%c)",i,G.vertices[i].data);
++count;
for(p=G.vertices[i].link;p;p=p->nextarc)
{
k=p->adjvex;
if (--G.vertices[k].inDegree==0)
{
stack[top++]=k;
}
if ((ve[i]+p->info)>ve[k])
{
ve[k]=ve[i]+p->info;
}
}
}
if (count<G.vexnum)
{
printf("网中有环!");
}
}

void CriticalPath(ALGraph G)
{
TopologicalOrder(G);
int vl[MAX+1];
int j;
ArcNode* p;
int k,dut,ee,el;
char tag;
for(int i=0;i
{
vl[i]=ve[G.vexnum-1];
}
while (top2>0)
{
j=stack2[--top2];
for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
if (vl[k]-dut
{
vl[j]=vl[k]-dut;
}
}
}
for(j=0;j
for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
ee=ve[j];
el=vl[k]-dut;
tag=(ee==el)?'*':' ';
printf("活动%d--->%d权值:%d 最早开始时间%d 最晚开始时间%d 是否关键活动:%c ",j,k,dut,ee,el,tag);
}
}

int? main()
{
ALGraph G;
printf("输入节点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);

CreateGraph(G);
TopologicalOrder(G);
CriticalPath(G);
return 0;
}

*/

解决方案

代码太长了,建议自己调试下看看

时间: 2024-09-17 12:20:44

关键路径-为什么第一个程序不能正常运行的相关文章

《“笨办法”学Python(第3版)》——习题1 第一个程序

习题1 第一个程序 你应该在习题0上花了不少的时间,学会了如何安装文本编辑器,运行文本编辑器,以及如何运行终端.如果你还没有完成这些练习,请不要继续往下进行了,否则你不会觉得很好过的.写在习题开头警告你不要跳过前面内容的警示本书中仅此一次,切记切记. 将下面的内容写到一个文件中,取名为ex1.py.这种命名方式很重要,Python文件最好以.py结尾. ex1.py print "Hello World!" print "Hello Again" print &qu

《像计算机科学家一样思考C++》——1.5 第一个程序

1.5 第一个程序 像计算机科学家一样思考C++按照惯例,人们用新语言编写的第一个程序叫做"Hello World".因为它所做的所有事情就是输出"Hello,World".在C++中,这个程序是这样的: #include <iostream.h> // main: generate some simple output void main () { cout << "Hello, world." << end

spring aop 配置文件提示报错,但程序能正常运行

问题描述 spring aop 配置文件提示报错,但程序能正常运行 spring aop 配置的时候报错导入的jar包如下: 程序运行没有问题,但是这个报错总是存在,找了很多资料,始终没有解决,求大神赐教! 解决方案 未导入spring对应的DTD标签库

第一代程序员聚会的背后故事

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 金山软件20年高峰论坛嘉宾:王永民.王江民.王志东.求伯君.李儒雄.吴晓军.周志农.雷军.鲍岳桥.简晶.陈宗周. 1.最强阵容.终于有时间来回忆一些事,某些成为历史的事在忘记之前需要用记录下来.11月12日,作为金山20周年庆典的前奏,"中国软件20年,知识英雄再聚首"高峰论坛在北京举行.这个活动由求伯君.王志东共同发起,

孙鑫的第一个程序,为什么 调试没有错误,运行后却什么也没有啊?

问题描述 孙鑫的第一个程序,为什么 调试没有错误,运行后却什么也没有啊? #include #include LRESULT CALLBACK WinsunProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinM

《Java编码指南:编写安全可靠程序的75条建议(英文版)》—— 第2章 编写第一个程序 2.1 编写程序所需的工具

第2章 编写第一个程序 本章介绍如下内容: 在文本编辑器中输入一个Java程序: 使用括号组织程序: 将信息存储到变量中: 显示存储在变量中的信息: 保存.编译和运行程序. 第1章已经提到,计算机程序是一组告诉计算机做什么的指令.这些指令使用编程语言输入到计算机中. 在本章,读者将通过将指令输入到文本编辑器的方式来创建第一个Java程序.输入完毕之后,可以保存.编译并测试该程序.然后你可以破坏该程序,然后再进行修复. 2.1 编写程序所需的工具 第1章讲到,要创建Java程序,你必须有支持Jav

c语言-C语言,程序结构 程序不能正常运行

问题描述 C语言,程序结构 程序不能正常运行 #include #include #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; int found; BinTNode *p; /*****************建立二叉树****

《OpenGL编程指南(原书第9版)》——1.5 第一个程序:深入分析

1.5 第一个程序:深入分析 现在我们来深入探讨一下之前的第一个程序.1.5.1 进入main()函数 为了了解示例程序从一开始是如何运行的,首先了解一下main()函数当中都发生了什么.前面的6行使用GLFW设置和打开了一个渲染用的窗口.这方面的详细介绍可以参见附录A,这里只介绍每一行的执行结果. 第一个函数glfwtInit()负责初始化GLFW库.它会处理向程序输入的命令行参数,并且移除其中与控制GLFW如何操作相关的部分(例如设置窗口的大小).glfwtInit()必须是应用程序调用的第

脚本-linux AWK报越界错误,但是程序能正常运行,为啥?

问题描述 linux AWK报越界错误,但是程序能正常运行,为啥? 在shell脚本中: arr=(awk 'NR==2{for(i=1;i<=$infoo1;i++)printf $i" "}' $1) // 我用awk读取一个文本的第二行,并将每个域的元素依次赋值给数组arr[],$1是 shell从命令行传入的参数,即我读取的文本的路径,这个文本很简单,第二行内容如下: p.jpg-1 p.jpg-2 p.jpg-3 p.jpg-4 p.jpg-5 p.jpg-6 p.jp