| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 440 人关注过本帖, 1 人收藏
标题:关键路径的计算程序设计
取消只看楼主 加入收藏
z中介公司
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-20
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:0 
关键路径的计算程序设计
哪位大哥能帮帮小弟画一下这个程序的流程图?
万分感谢!
#include "stdio.h"

#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <process.h>

using namespace std;
//#define PROJECTUNMBER 9//10
//#define PLANNUMBER 11//13
typedef struct node
{
    int adjvex;
    int dut;
    struct node *next;
}edgenode;
typedef struct
{
    int projectname;
    int id;
    edgenode *link;
}vexnode;
//vexnode Graphicmap[PROJECTNUMBER];
void GreateGraphic(vexnode* Graphicmap,int projectnumber,int activenumber)
{
    int begin,end,duttem;
    edgenode *p;
    for(int i=0;i<projectnumber;i++)
    {  
        Graphicmap[i].projectname=i;
        Graphicmap[i].id=0;
        Graphicmap[i].link=NULL;
    }
    printf("某项目的开始到结束在图中的节点输入<vi,vj,dut>\n");
    printf("如:3,4,9回车表示第三节点到第四节点之间的活动用了9个单位时间\n");
    printf("*********************************************\n");
    for(int k=0;k<activenumber;k++)
    {
        scanf("%d,%d,%d",&begin,&end,&duttem);
        p=(edgenode*)malloc(sizeof(edgenode));
        p->adjvex=end-1;
        p->dut=duttem;
        Graphicmap[end-1].id++;
        p->next=Graphicmap[begin-1].link;
        Graphicmap[begin-1].link=p;
    }
}
int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenumber,int& totaltime)
{
    int i,j,k,m=0;
    int front=-1,rear=-1;
    int* topologystack=(int*)malloc(projectnumber*sizeof(int));           //用来保存拓扑排列
    int* vl=(int*)malloc(projectnumber*sizeof(int));                     //用来表示在不推迟整个工程的前提下,vl允许最迟发生时间
    int* ve=(int*)malloc(projectnumber*sizeof(int));                       //用来表示vj最早发生时间
    int* l=(int*)malloc(activenumber*sizeof(int));                       //用来表示活动Ai最迟完成开始时间
    int* e=(int*)malloc(activenumber*sizeof(int));                           //表示活动最早开始时间
    edgenode *p;
    totaltime=0;
    for(i=0;i<projectnumber;i++) ve[i]=0;
    for(i=0;i<projectnumber;i++)                                       
    {
        if(Graphicmap[i].id==0)
        {
            topologystack[++rear]=i;
            m++;
        }
    }
    while(front!=rear)
    {
        front++;
        j=topologystack[front];
        m++;
        p=Graphicmap[j].link;
        while(p)
        {
            k=p->adjvex;
            Graphicmap[k].id--;
            if(ve[j]+p->dut>ve[k])
                ve[k]=ve[j]+p->dut;
            if(Graphicmap[k].id==0)
                topologystack[++rear]=k;
            p=p->next;
        }
    }
    if(m<projectnumber)
    {
        printf("\n本程序说建立的图有回路不可计算出关键路径\n");
        printf("将退出本程序\n");
        return 0;
    }
    totaltime=ve[projectnumber-1];
    for(i=0;i<projectnumber;i++)
        vl[i]=totaltime;
    for(i=projectnumber-2;i>=0;i--)
    {
        j=topologystack[i];
        p=Graphicmap[j].link;
        while(p)
        {
            k=p->adjvex;
            if((vl[k]-p->dut)<vl[j])
                vl[j]=vl[k]-p->dut;
            p=p->next;
        }
    }
    i=0;   
    printf("|起点 |终点|最早开始时间 |最迟完成时间 |差值| 备注    |\n");
    for(j=0;j<projectnumber;j++)
    {
        p=Graphicmap[j].link;
        while(p)
        {
            k=p->adjvex;
            e[++i]=ve[j];
            l[i]=vl[k]-p->dut;
            printf("|  %4d  |  %4d  |  %4d  |   %4d  |   %4d  |",
                Graphicmap[j].projectname+1,Graphicmap[k].projectname
                +1,e[i],l[i],l[i]-e[i]);
            if(l[i]==e[i])
                printf("关键活动  |");
            printf("\n");
            p=p->next;
        }
    }
    return 1;
}
void seekkeyroot()
{
    int projectnumber,activenumber,totaltime=0;
    system("cls");
    printf("请输出这个工程的化成图形的节点数:");
    scanf("%d",&projectnumber);
    printf("\n");
    printf("请输入这个工程的活动个数:");
    scanf("%d",&activenumber);
    printf("\n");
    vexnode* Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));
    GreateGraphic(Graphicmap,projectnumber,activenumber);
    SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime);
    printf("整个工程所用的最短时间为:%d个单位时间\n",totaltime);
    system("pause");
}   
int main()
{
   
   
    char ch;
    for(;;)
    {
        do
        {
            system("cls");
            printf("|          欢迎进入求关键路径算法程序     |");
            for(int i=0;i<80;i++)printf("*");
            printf("\n");
            printf("%s","(S)tart  开始输入工程的节点数据并求出关键路径\n");
            printf("\n");
            printf("%s","(E)xit   退出\n");
            printf("\n");
            printf("%s","请输入选择:");
            scanf("%c",&ch);
            ch=toupper(ch);
            if(ch!='S'&&ch!='E')
                printf("请输入正确的字符!\n");
            system("pause");
        }while(ch!='S'&&ch!='E');
        switch(ch)
        {
        case'S':
            seekkeyroot();
            break;
        case'E':
            return 1;
        }     
    }
}
搜索更多相关主题的帖子: 程序设计 include 流程图 
2012-12-20 12:45
快速回复:关键路径的计算程序设计
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022346 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved