⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aoe.cpp

📁 该程序能实现的功能
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<iomanip.h>
#include <process.h>

typedef struct node
{
       int adjvex;
       int dut;
       struct node *next;
}edgenode;
typedef struct 
{
       int  projectname;
       int  id;
       edgenode *link;
}vexnode;

void CreateGraphic(vexnode*,int,int);
int SearchPath(vexnode*,int,int,int&);

void main()
{     
       int flag,projectnum,activenum,totaltime=0;
	   printf("请输入这个工程的化成图形的结点数:");
       scanf("%d",&projectnum);
    printf("请输入这个工程的活动个数:");
    scanf("%d",&activenum);
    vexnode* Graphicmap=(vexnode*)malloc(projectnum*sizeof(vexnode));
    CreateGraphic(Graphicmap,projectnum,activenum);
    flag=SearchPath(Graphicmap,projectnum,activenum,totaltime);
	if(flag==0)
	     printf("\n本程序所建立的图有回路不可计算出关键路径\n");
	else
	  	printf("\n全工程可以完成的最早时间为:%d个单位时间\n",totaltime);
     system("pause");
}



void CreateGraphic(vexnode* Graphicmap,int projectnum,int activenum)  //创建图的函数
{
       int begin,end,duttem;
       edgenode *p;
       for(int i=0;i<projectnum;i++)
       {
		   Graphicmap[i].projectname=i;
           Graphicmap[i].id =0;
           Graphicmap[i].link =NULL;
       }     
       printf("某项目的开始到结束在图中的节点输入<vi,vj,dut>\n");
       printf("如:1,2,3 回车表示第1结点到第2结点之间的活动用了3个单位时间\n");
       for(int k=0;k<activenum;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 SearchPath(vexnode* Graphicmap,int projectnum,int activenum,int& totaltime)//查找关键路径
{
       int i,j,k,m=0;
       int front=-1,rear=-1;
       int* topologystack=(int*)malloc(projectnum*sizeof(int));//保存拓扑排列
       int* vl=(int*)malloc(projectnum*sizeof(int));//表示在不推迟整个工程的前提下,Vj允许最迟发生的时间
       int* ve=(int*)malloc(projectnum*sizeof(int));//表示Vj最早发生时间
       int* l=(int*)malloc(activenum*sizeof(int));//表示活动Ai最迟完成开始时间
       int* e=(int*)malloc(activenum*sizeof(int));//表示活动最早开始时间
       edgenode *p;
       totaltime=0;
       for(i=0;i<projectnum;i++) ve[i]=0;
       for(i=0;i<projectnum;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<projectnum)
       {
           	  return 0;
              
       }
       totaltime=ve[projectnum-1];
       for(i=0;i<projectnum;i++)
              vl[i]=totaltime;
       for(i=projectnum-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<projectnum;j++)
       {
              p=Graphicmap[j].link;
              while(p)
              {
                     k=p->adjvex ;
                     e[++i]=ve[j];
                     l[i]=vl[k]-p->dut;
                     printf("%6d%8d%13d%18d%12d  ",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;
       
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -