课设-关键路径问题(设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动)

问题描述

关键路径问题(设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动)

设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
1、对一个描述工程的AOE网,应判断其是否能够顺利进行。
2、若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点、最早发生时间、最迟发生时间。

设计要求:
(1) 符合课题要求,实现相应功能;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序的实用性、安全性;
**菜鸟求带啊 **

解决方案

http://wenku.baidu.com/link?url=fW2GpqW85Tn-oJr45xe9bcLs-TmRANPwADdO9p-vMmLoTEVeGpjHlqtE2FfnTm2K5TO3YDJ4WH5hrDTGlm-z0e5eGU4sKJZO2LxJq6CP7o3

解决方案二:

 #include <iostream>
using namespace std;
#define MAX 10000000
#define MAX_VERTEX_NUM 20
int ve[MAX_VERTEX_NUM];
/*顺序栈的定义*/
#define Stack_Size 100
typedef struct sqStack
{
       int *elem;
       int top;
       int stackSize;//栈数组长度
}sqStack;

/*顺序栈的初始化*/
void initStack_Sq(sqStack &S)
{
       S.elem=new int[Stack_Size];
       S.top=-1;
       S.stackSize=Stack_Size;
}
/*入栈*/
void push(sqStack &S,int x)
{
       if(S.top==Stack_Size-1)
              cout<<"Stack Overflow!";
       S.elem[++S.top]=x;
}

/*出栈*/
int pop(sqStack &S)
{
       int x;
       if(S.top==-1)
              cout<<"Stack Empty!";
       x=S.elem[S.top--];
       return x;
}
typedef struct EdgeNode
{//边表结点的定义
    int adjvex;//存放邻接点在顶点表中的位置
    struct EdgeNode * nextedge;//指向下一个边表结点
    int weight;
}EdgeNode;
typedef struct VexNode
{//顶点表结点的定义
    char vex;//存放顶点信息
    EdgeNode * firstedge;//指向第一个边表结点
    int indegree;
}VexNode;
typedef struct
{//顶点表的定义
    VexNode vexs[MAX_VERTEX_NUM];
    int vexnum,edgenum;
}LGraph;
/*构造有向图的邻接表*/
void CreateDG_AL(LGraph &G,int n,int e)
{
    int i,j,k,w;
    G.vexnum=n;
    G.edgenum=e;
    for(i=0;i<n;i++)
    {
        cin>>G.vexs[i].vex;
        G.vexs[i].firstedge=NULL;//初始化为空
    }
    for(k=0;k<e;k++)
    {
        EdgeNode *p;
        cin>>i>>j>>w;
        p=new EdgeNode;
        p->adjvex=j;
        p->weight=w;
        p->nextedge=G.vexs[i].firstedge;
        G.vexs[i].firstedge=p;//采用头插法
    }
}
//拓扑排序并求各顶点事件的最早发生时间及拓扑逆序列
void TopoSort(LGraph &G,sqStack &T)
{
    sqStack S;
    initStack_Sq(S);
    EdgeNode *p;

    int count=0;
    int i;
    for(i=0;i<G.vexnum;i++)
        G.vexs[i].indegree=0;//初始化为0
    for(i=0;i<G.vexnum;i++)
    {//计算各个顶点的入度
        p=G.vexs[i].firstedge;
        while(p)
        {
            G.vexs[p->adjvex].indegree++;
            p=p->nextedge;
        }
    }
    for(i=0;i<G.vexnum;i++)
        if(G.vexs[i].indegree==0)
            push(S,i);//将度为0的顶点入栈,这里进栈的是入度为0的顶点在数组中的位置
    for(i=0;i<G.vexnum;i++)
        ve[i]=0;//初始化顶点事件的最早发生时间为0
    while(S.top!=-1)
    {
        i=pop(S);
        cout<<G.vexs[i].vex<<" ";//将栈顶的元素出栈且输出,即将入度为0的顶点输出
        push(T,i);//为了求得拓扑序列的逆序列,将元素依次进栈就得到了逆序列
        count++;//计数器加1
        p=G.vexs[i].firstedge;//让p指向入度为0的顶点的第一个边表结点
        while(p)
        {
            int k;
            int dut;
            dut=p->weight;
            k=p->adjvex;
            G.vexs[k].indegree--;//将入度为0的顶点的邻接点的入度减1
            if(G.vexs[k].indegree==0)
                push(S,k);//度减1后的顶点如果其入度为0,则将其入栈
            if(ve[i]+dut>ve[k])
                ve[k]=ve[i]+dut;//经过while循环,将顶点事件的所有邻接点的最早发生时间算出来,
                                //并且经过外层的while循环,不断地更新为较大的ve[k]值
            p=p->nextedge;
        }
    }
    cout<<endl;
    if(count<G.vexnum)
        cout<<"Network G has citcuits!"<<endl;
}
//求关键路径和关键活动
void CriticalPath(LGraph &G)
{
    int i,j,k,dut;
    int ee,el;
    int vl[MAX_VERTEX_NUM];
    EdgeNode *p;
    sqStack T;
    initStack_Sq(T);
    TopoSort(G,T);
    for(i=0;i<G.vexnum;i++)
        vl[i]=ve[G.vexnum-1];//初始化顶点事件的最迟发生时间为汇点的最早发生时间
                            //因为求最迟发生时间是从汇点向源点开始计算的
    while(T.top!=-1)
    {//经过while循环,按堆栈顺序求出每个顶点的最迟发生时间
        for(j=pop(T),p=G.vexs[j].firstedge; p ;p=p->nextedge)
        {//这里应该注意for循环的机制:每一次循环都要判断一次条件,包括第一次
            k=p->adjvex;
            dut=p->weight;
            if(vl[k]-dut<vl[j])
                vl[j]=vl[k]-dut;//按堆栈T中事件的顺序,将该顶点事件的最迟发生时间经过for循环算出来,
                                //注意:经过for循环算出的是一个顶点的最迟发生时间
        }
    }
    for(i=0;i<G.vexnum;i++)
    {//依次遍历每一个活动
        for(p=G.vexs[i].firstedge;p;p=p->nextedge)
        {
            k=p->adjvex;
            dut=p->weight;
            ee=ve[i];//求活动的最早开始时间
            el=vl[k]-dut;//求活动的最迟开始时间
            if(ee==el)
            {//若两者相等,说明这这个活动为关键活动
                cout<<"("<<G.vexs[i].vex<<","<<G.vexs[k].vex<<")"<<dut<<" ";
                cout<<"ee="<<ee<<","<<"el="<<el<<endl;
            }
        }
    }
}
void main()
{
    freopen("in.txt","r",stdin);
    LGraph G;
    CreateDG_AL(G,9,11);
    CriticalPath(G);
}

这个是c++写的,这种作业一般晚上找点代码,改一改就行了

时间: 2024-11-01 11:16:49

课设-关键路径问题(设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动)的相关文章

用C++设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动

问题描述 用C++设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动 大神们,求解啊,跪求了,课程设计啥也不会,有没有大神能够教一下 解决方案 #include <iostream>#include <fstream>#include <cstdlib>#include <iomanip>#include <string>#define MAX_VERTEX_NUM 99#define NULL 0int ij;using na

mfc-MFC课设时做了一个bmp格式转jpg格式出错,求大神解答

问题描述 MFC课设时做了一个bmp格式转jpg格式出错,求大神解答 BmpVsJpgDlg.obj : error LNK2001: unresolved external symbol "public: int thiscall CDib::Write(class CFile *)" (?Write@CDib@@QAEHPAVCFile@@@Z) BmpVsJpgDlg.obj : error LNK2001: unresolved external symbol "pu

急急急!设计一个程序实现基于二叉树的算术表达式的操作 求代码 有重谢!

问题描述 急急急!设计一个程序实现基于二叉树的算术表达式的操作 求代码 有重谢! [问题描述] 一个表达式和一棵二叉树之间,存在着自然的对应关系.写一个程序,实现基于二叉树表示的算术表达式的操作. 知识点:二叉树,表达式树,二叉树遍历 难度级:★★★ [任务要求] 假设算术表达式 Expression 内可以含有变量(a-z).常量(0-9)和二元运算符(+,-,*,/,^(乘幂)). 实现以下操作: 1) ReadExpre(E)-以字符序列的形式输入语法正确的前缀表达式并构造表达式 E. 2

c语言-求各位大师帮帮忙设计一个程序 C语言 写出代码

问题描述 求各位大师帮帮忙设计一个程序 C语言 写出代码 设计某班学生成绩管理系统,要求实现以下功能: 1.从键盘输入学号.姓名.各门课程成绩(不少于2门),并将其保存在文件中. 2.打开文件后,计算每个人的总分和平均分,排序并保存. 3.可以在文件中进行单项查询或多项查询的功能. 万谢 解决方案 人都这样,有了想法就不想写代码了,想叫别人写,所以才雇佣别人去做码农 解决方案二: 这种作业题在网上搜搜都会有的,比如这个http://blog.csdn.net/sdliujiangbo/artic

编程-在设计一个程序解决问题时,怎样知道需要几个变量,以及变量的类型?

问题描述 在设计一个程序解决问题时,怎样知道需要几个变量,以及变量的类型? 刚开始学编程,有时候程序能看懂,但是自己设计的时候就不知道怎么设置变量...请问这涉及到哪些知识呢?还是说接触到一定量的程序后自己就知道了呢? 解决方案 是的,你的问题很正常.实际上并不是所有的变量我们都可以在程序设计的阶段知道是不是需要它以及类型. 举一个例子,用C语言去写一个解释语言的解释器(很多Basic语言解释器就是C写的),读入一段程序,并且解释执行,很明显,这段程序是什么不知道,运行时需要什么变量更不知道了.

java-JAVA客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能。

问题描述 JAVA客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能. 客户信息保存在user数据表中,设计一个程序,实现修改用户密码的功能. 解决方案 无非就是最简单的数据库读和改.看你用什么数据库搜索 java数据库增删改查 +你用的数据库就能找到现成的代码. 解决方案二: jdbc连接数据库,剩下的,自己学习java如何操作数据库,都是初学者该明白的东西 解决方案三: 首先是链接数据库,然后就是操作数据库,进行修改 解决方案四: 1,在Java中使用JDBC连接数据库co

我想设计一个程序,点击关闭后会自动跳转到一个网址,请问代码怎么写

问题描述 我想用VC6.0设计一个程序,点击关闭(即右上角X号)后会自动跳转到一个网址(www.xxxx.com),请问代码怎么写小弟是个菜鸟,请说得详细些,好吗?谢谢! 解决方案 解决方案二:在关闭事件里system"iexplore.exehttp://xxxxx"先拦截关闭事件吧,俺用拦截SYS_COMMAND来实现,参数忘了.解决方案三:你响应窗口的WM_SYSCOMMAND消息,重载OnSysCommand函数,点X时查看传进来的参数是什么,以后可以判断遇到这样的参数是就是关

游戏编程-如何设计一个算法求coinfilp游戏中的最佳步骤呢?

问题描述 如何设计一个算法求coinfilp游戏中的最佳步骤呢? 就是那个cocos2dx示例中的翻硬币游戏.规则如下: 1.有NxM的格子,N和M都是可变的,每个格子有一个硬币,有正反两面. 2.当点击某一个硬币时,该硬币和其相邻的四个硬币(如果存在)一起翻面.当场上所有硬币都处于正面时,游戏完成. 因为我不知道这个游戏如何玩,因此想写一个算法,自动求出任意状态下到达游戏完成的最佳步骤.但现在毫无头绪..求大神帮助

排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构

问题描述 排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构 设计一个程序,用于查询一个IP所在的机构.具体要求:1. 设计一个函数,用于比较两个IP地址(字符串)的大小, 2. 从外部数据文件(IP.TXT)中读取IP数据; 3. 用平衡二叉排序树存储IP及其所属机构名称;4. 输入一个IP地址,查找并输出与此IP对应的机构名称; 5. 输入一个机构名称,查询与此机构对应的的IP地址; 解决方案 算法部分可以使用STL. 解决方案二: #inc