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

问题描述

用C++设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动
大神们,求解啊,跪求了,课程设计啥也不会,有没有大神能够教一下

解决方案

#include <iostream>#include <fstream>#include <cstdlib>#include <iomanip>#include <string>#define MAX_VERTEX_NUM 99#define NULL 0int ij;using namespace std;typedef struct Arcnode{char adjvex;int number;struct Arcnode *nextarc;int time;}Acrnode;typedef struct VNode{char data;Acrnode *firstarc;}VNodeAdjlist[MAX_VERTEX_NUM];typedef struct{Adjlist vertices;int vexnumarcnum;}ALGraph;typedef struct{int *base;int *top;int stacksize;}Sqstack;void exampleout(){ifstream fin;ofstream fout;fin.open(""example.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}char a;fin.get(a);while(!fin.eof()){cout << a;fin.get(a);}fin.close();}void print(){ifstream fin;ofstream fout;fin.open(""result.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}char a;fin.get(a);while(!fin.eof()){cout << a;fin.get(a);}fin.close();}int number(string b)//将数字字符串转化为对应的数字{int flagnumnumber=0;int mn;flag=b.length();for(m=0;m<flag;m++){ num=b[m]-48;for(n=0;n<flag-m-1;n++)num=num*10;number=number+num;}return number;}void datain(ALGraph *G){Acrnode *p*q;i=0; j=0;char a; string b;ifstream fin;ofstream fout;fin.open(""data.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}fin.get(a);while(a!='n'){G->vertices[i].data=a;//cout << G->vertices[i].data;fin.get(a);i++;G->vexnum=i;}G->arcnum=0;for(j=0;j<G->vexnum;j++){fin.get(a);if(a!='n'){G->vertices[j].firstarc=(Acrnode *)malloc(sizeof(Acrnode));G->vertices[j].firstarc->adjvex=a;G->vertices[j].firstarc->nextarc=NULL;//cout << G->vertices[j].data << G->vertices[j].firstarc->adjvex;getline(finb' '); G->vertices[j].firstarc->time=number(b);G->arcnum++;//cout << G->vertices[j].firstarc->time;q=G->vertices[j].firstarc;fin.get(a);while(a!='n'){p=(Acrnode *)malloc(sizeof(Acrnode));p->adjvex=a;//cout << p->adjvex;p->nextarc=NULL;q->nextarc=p;q=p;getline(finb' '); p->time=number(b);G->arcnum++;//cout << p->time;fin.get(a);}}}//cout << G->arcnum;fin.close();}void Findindegree(ALGraph G int indegree[]){char x; Acrnode *r;for(i=0;i<G.vexnum;i++){x=G.vertices[i].data;for(j=0;j<G.vexnum;j++){r=G.vertices[j].firstarc;while(r!=NULL){if(r->adjvex==x) {indegree[i]++;r->number=i;r=NULL;}else r=r->nextarc;}} //cout << indegree[i];}}void Initstack(Sqstack &S){S.base=(int *)malloc(MAX_VERTEX_NUM * sizeof(int));S.top=S.base;S.stacksize=MAX_VERTEX_NUM;}int Stackempty(Sqstack S){if(S.top==S.base) return 1;else return 0;}void Push(Sqstack &Sint x){*S.top=x;S.top++;}void Pop(Sqstack &Sint &x){x=*--S.top;}void Topologicalsort(ALGraph Gint indegree[])//有向图G采用邻接表存储结构。//若G无回路,则输出G的顶点的一个拓扑序列否则返回ERROR。{ Findindegree(Gindegree); //对各个顶求入度indegree[0..vernum-1]Acrnode *p; int countk;Sqstack S;Initstack(S);for (i=0;i<G.vexnum;++i) //建零入度顶点栈Sif(!indegree[i]) Push(Si); //入度为0者入栈count=0; //对输出顶点计数while(!Stackempty(S)){Pop(Si); //cout << G.vertices[i].data; //输出i号顶点并计数++count; for(p=G.vertices[i].firstarc; p; p=p->nextarc){k=p->number; //对i号顶点的每个邻接点的入度减1if(!(--indegree[k])) Push(Sk); //若入度减为0,则入栈}}if(count<G.vexnum) cout << ""ERROR!该工程不能顺利完成!""; //该有向图有回路else cout << ""Ready!该工程可以顺利完成!"" << endl;}void Topologicalorder(ALGraph GSqstack &Tint indegree[]int ve[])//有向网G采用邻接表存储结构,求各顶点事件的最早发生时间ve//T为拓扑排序顶点栈,S为零入度顶点栈。//若G无回路,则用栈T返回G的一个拓扑序列,且函数值为OK,否则为ERROR。{Findindegree(Gindegree); //对各个顶求入度indegree[0..vernum-1]Acrnode *p; int countk;Sqstack S;Initstack(S);for (i=0;i<G.vexnum;++i) //建零入度顶点栈Sif(!indegree[i]) Push(Si); //入度为0者入栈count=0; //对输出顶点计数while(!Stackempty(S)){Pop(Sj); Push(Tj); ++count; //j号顶点入T栈并计数for(p=G.vertices[j].firstarc; p; p=p->nextarc){k=p->number; //对i号顶点的每个邻接点的入度减1if(!(--indegree[k])) Push(Sk); //若入度减为0,则入栈if(ve[j]+p->time>ve[k]) ve[k]=ve[j]+p->time;} }//for (i=0;i<G.vexnum;++i)//cout << ve[i];ofstream fout;fout.open(""result.txt"");fout.close();if(count<G.vexnum) cout << ""ERROR""; //该有向图有回路}void result(int a[]int b[]ALGraph Gint ve[]int vl[]){ofstream fout;fout.open(""result.txt"");fout << ""工程的最短耗时为: "" << ve[G.vexnum-1] << endl;fout << ""关键活动 最早开始时间 最晚开始时间"" << endl;for(j=0;j<i;j++){fout << "" <"" << G.vertices[a[j]].data << "" << G.vertices[b[j]].data << ""> "";fout << ve[a[j]] << "" "" << ve[b[j]] << "" "";fout << vl[a[j]] << "" "" << vl[b[j]] << "" "" << endl;}fout.close();}void Criticalpath(ALGraph Gint indegree[]int ve[]int vl[]){int a[MAX_VERTEX_NUM]={0};int b[MAX_VERTEX_NUM]={0};Sqstack T;Initstack(T);Topologicalorder(GTindegreeve); Acrnode *p;int kduteeel;for(i=0;i<G.vexnum;++i)vl[i]=ve[G.vexnum-1]; //初始化顶点时间的最迟发生时间while(!Stackempty(T)) //按逆拓扑排序求各顶点的vl值{for(Pop(Tj)p=G.vertices[j].firstarc; p; p=p->nextarc){k=p->number; dut=p->time; if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut; //dut<jk>}}i=0;for(j=0;j<G.vexnum;++j) //求ee,el和关键活动for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->number; dut=p->time;ee=ve[j]; el=vl[k]-dut;if(ee == el){a[i]=j;b[i]=k;i++;} //输出关键活动}result(abGvevl);}int main(){ALGraph G; int ddy; char bye;for(j=0;j<MAX_VERTEX_NUM;j++) {G.vertices[j].data=0;G.vertices[j].firstarc=NULL;}int indegree[MAX_VERTEX_NUM]={0};int ve[MAX_VERTEX_NUM]={0};int vl[MAX_VERTEX_NUM]={0};cout << ""WELLCOME!本程序将计算工程的最短耗时和关键路径"" << endl;do{cout << endl << ""请选择:"" << endl;cout << ""1.查看数据文件示例文本"" << endl;cout << ""2.检查输入的工程能否顺利完成"" << endl;cout << ""3.计算工程的最短耗时和关键路径并生成文本文件"" << endl;cout << ""4.显示计算结果"" << endl;cout << ""0.退出"" << endl << endl;cin >> ddy;switch(ddy){case 1:exampleout();break;case 2:{datain(&G); Topologicalsort(Gindegree);}break;case 3:Criticalpath(Gindegreevevl);break;case 4:{print();cout << endl;}break;case 0:cout << ""再见!"";break;}}while(ddy!=0);cin.get(bye);cin.get(bye);return 0;}data.txtABCDEFGHIB6 C4 D5 E1 E1 F2 G9 H7 H4 I2 I4 example.txtABCDEFGHI(事件代号)B6 C4 D5 (每个事件的后继事件及活动时间)E1 (每个数字后空格)E1 F2 G9 H 7 H4 I2 I4

解决方案二:
代码乱了,请直接参考:http://zhidao.baidu.com/question/572682269.html

解决方案三:

 #include <iostream>#include <fstream>#include <cstdlib>#include <iomanip>#include <string>#define MAX_VERTEX_NUM 99#define NULL 0int ij;using namespace std;typedef struct Arcnode{char adjvex;int number;struct Arcnode *nextarc;int time;}Acrnode;typedef struct VNode{char data;Acrnode *firstarc;}VNodeAdjlist[MAX_VERTEX_NUM];typedef struct{Adjlist vertices;int vexnumarcnum;}ALGraph;typedef struct{int *base;int *top;int stacksize;}Sqstack;void exampleout(){ifstream fin;ofstream fout;fin.open(""example.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}char a;fin.get(a);while(!fin.eof()){cout << a;fin.get(a);}fin.close();}void print(){ifstream fin;ofstream fout;fin.open(""result.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}char a;fin.get(a);while(!fin.eof()){cout << a;fin.get(a);}fin.close();}int number(string b)//将数字字符串转化为对应的数字{int flagnumnumber=0;int mn;flag=b.length();for(m=0;m<flag;m++){ num=b[m]-48;for(n=0;n<flag-m-1;n++)num=num*10;number=number+num;}return number;}void datain(ALGraph *G){Acrnode *p*q;i=0; j=0;char a; string b;ifstream fin;ofstream fout;fin.open(""data.txt"");if(fin.fail()){cout << ""Input file opening failed.n"";exit(1);}fin.get(a);while(a!='n'){G->vertices[i].data=a;//cout << G->vertices[i].data;fin.get(a);i++;G->vexnum=i;}G->arcnum=0;for(j=0;j<G->vexnum;j++){fin.get(a);if(a!='n'){G->vertices[j].firstarc=(Acrnode *)malloc(sizeof(Acrnode));G->vertices[j].firstarc->adjvex=a;G->vertices[j].firstarc->nextarc=NULL;//cout << G->vertices[j].data << G->vertices[j].firstarc->adjvex;getline(finb' '); G->vertices[j].firstarc->time=number(b);G->arcnum++;//cout << G->vertices[j].firstarc->time;q=G->vertices[j].firstarc;fin.get(a);while(a!='n'){p=(Acrnode *)malloc(sizeof(Acrnode));p->adjvex=a;//cout << p->adjvex;p->nextarc=NULL;q->nextarc=p;q=p;getline(finb' '); p->time=number(b);G->arcnum++;//cout << p->time;fin.get(a);}}}//cout << G->arcnum;fin.close();}void Findindegree(ALGraph G int indegree[]){char x; Acrnode *r;for(i=0;i<G.vexnum;i++){x=G.vertices[i].data;for(j=0;j<G.vexnum;j++){r=G.vertices[j].firstarc;while(r!=NULL){if(r->adjvex==x) {indegree[i]++;r->number=i;r=NULL;}else r=r->nextarc;}} //cout << indegree[i];}}void Initstack(Sqstack &S){S.base=(int *)malloc(MAX_VERTEX_NUM * sizeof(int));S.top=S.base;S.stacksize=MAX_VERTEX_NUM;}int Stackempty(Sqstack S){if(S.top==S.base) return 1;else return 0;}void Push(Sqstack &Sint x){*S.top=x;S.top++;}void Pop(Sqstack &Sint &x){x=*--S.top;}void Topologicalsort(ALGraph Gint indegree[])//有向图G采用邻接表存储结构。//若G无回路,则输出G的顶点的一个拓扑序列否则返回ERROR。{ Findindegree(Gindegree); //对各个顶求入度indegree[0..vernum-1]Acrnode *p; int countk;Sqstack S;Initstack(S);for (i=0;i<G.vexnum;++i) //建零入度顶点栈Sif(!indegree[i]) Push(Si); //入度为0者入栈count=0; //对输出顶点计数while(!Stackempty(S)){Pop(Si); //cout << G.vertices[i].data; //输出i号顶点并计数++count; for(p=G.vertices[i].firstarc; p; p=p->nextarc){k=p->number; //对i号顶点的每个邻接点的入度减1if(!(--indegree[k])) Push(Sk); //若入度减为0,则入栈}}if(count<G.vexnum) cout << ""ERROR!该工程不能顺利完成!""; //该有向图有回路else cout << ""Ready!该工程可以顺利完成!"" << endl;}void Topologicalorder(ALGraph GSqstack &Tint indegree[]int ve[])//有向网G采用邻接表存储结构,求各顶点事件的最早发生时间ve//T为拓扑排序顶点栈,S为零入度顶点栈。//若G无回路,则用栈T返回G的一个拓扑序列,且函数值为OK,否则为ERROR。{Findindegree(Gindegree); //对各个顶求入度indegree[0..vernum-1]Acrnode *p; int countk;Sqstack S;Initstack(S);for (i=0;i<G.vexnum;++i) //建零入度顶点栈Sif(!indegree[i]) Push(Si); //入度为0者入栈count=0; //对输出顶点计数while(!Stackempty(S)){Pop(Sj); Push(Tj); ++count; //j号顶点入T栈并计数for(p=G.vertices[j].firstarc; p; p=p->nextarc){k=p->number; //对i号顶点的每个邻接点的入度减1if(!(--indegree[k])) Push(Sk); //若入度减为0,则入栈if(ve[j]+p->time>ve[k]) ve[k]=ve[j]+p->time;} }//for (i=0;i<G.vexnum;++i)//cout << ve[i];ofstream fout;fout.open(""result.txt"");fout.close();if(count<G.vexnum) cout << ""ERROR""; //该有向图有回路}void result(int a[]int b[]ALGraph Gint ve[]int vl[]){ofstream fout;fout.open(""result.txt"");fout << ""工程的最短耗时为: "" << ve[G.vexnum-1] << endl;fout << ""关键活动 最早开始时间 最晚开始时间"" << endl;for(j=0;j<i;j++){fout << "" <"" << G.vertices[a[j]].data << "" << G.vertices[b[j]].data << ""> "";fout << ve[a[j]] << "" "" << ve[b[j]] << "" "";fout << vl[a[j]] << "" "" << vl[b[j]] << "" "" << endl;}fout.close();}void Criticalpath(ALGraph Gint indegree[]int ve[]int vl[]){int a[MAX_VERTEX_NUM]={0};int b[MAX_VERTEX_NUM]={0};Sqstack T;Initstack(T);Topologicalorder(GTindegreeve); Acrnode *p;int kduteeel;for(i=0;i<G.vexnum;++i)vl[i]=ve[G.vexnum-1]; //初始化顶点时间的最迟发生时间while(!Stackempty(T)) //按逆拓扑排序求各顶点的vl值{for(Pop(Tj)p=G.vertices[j].firstarc; p; p=p->nextarc){k=p->number; dut=p->time; if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut; //dut<jk>}}i=0;for(j=0;j<G.vexnum;++j) //求ee,el和关键活动for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->number; dut=p->time;ee=ve[j]; el=vl[k]-dut;if(ee == el){a[i]=j;b[i]=k;i++;} //输出关键活动}result(abGvevl);}int main(){ALGraph G; int ddy; char bye;for(j=0;j<MAX_VERTEX_NUM;j++) {G.vertices[j].data=0;G.vertices[j].firstarc=NULL;}int indegree[MAX_VERTEX_NUM]={0};int ve[MAX_VERTEX_NUM]={0};int vl[MAX_VERTEX_NUM]={0};cout << ""WELLCOME!本程序将计算工程的最短耗时和关键路径"" << endl;do{cout << endl << ""请选择:"" << endl;cout << ""1.查看数据文件示例文本"" << endl;cout << ""2.检查输入的工程能否顺利完成"" << endl;cout << ""3.计算工程的最短耗时和关键路径并生成文本文件"" << endl;cout << ""4.显示计算结果"" << endl;cout << ""0.退出"" << endl << endl;cin >> ddy;switch(ddy){case 1:exampleout();break;case 2:{datain(&G); Topologicalsort(Gindegree);}break;case 3:Criticalpath(Gindegreevevl);break;case 4:{print();cout << endl;}break;case 0:cout << ""再见!"";break;}}while(ddy!=0);cin.get(bye);cin.get(bye);return 0;}data.txtABCDEFGHIB6 C4 D5 E1 E1 F2 G9 H7 H4 I2 I4 example.txtABCDEFGHI(事件代号)B6 C4 D5 (每个事件的后继事件及活动时间)E1 (每个数字后空格)E1 F2 G9 H 7 H4 I2 I4

解决方案四:
这个数据结构书上不是有么。。。

解决方案五:
这个数据结构书上不是有么。。。

解决方案六:
这个数据结构书上不是有么。。。

时间: 2024-10-30 23:37:22

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

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

问题描述 关键路径问题(设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动) 设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动. 1.对一个描述工程的AOE网,应判断其是否能够顺利进行. 2.若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点.最早发生时间.最迟发生时间. 设计要求: (1) 符合课题要求,实现相应功能: (2) 要求界面友好美观,操作方便易行: (3) 注意程序的实用性.安全性: **菜鸟求带啊 **

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

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

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

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

c语言-求教编写一个函数求出两个字符串包含的相同的单词

问题描述 求教编写一个函数求出两个字符串包含的相同的单词 编写一个函数,函数首部为void maxword(char *s,char *t),求出两个字符串包含的相同单词(同一字母的大小写视为不同的字符).规定单词全部由英文字母构成,单词直接由一个或多个空格分隔.其中主函数如下: #include Void main() { Char s[]="This is C programming text"; Char t[]="This is a text for C progra

c语言-关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号

问题描述 关于数据结构的简单问题完整算法 C语言 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 假设用邻接矩阵存储无向图,设计算法,求出度数最大的顶点编号 急急急紧急急急急急急急急急急急急急急急急急急急急急急 解决方案 先是存储结构后是伪代码,你想要算法就看注释吧~ Typedef struct Node { Char vex; //顶点 Int degree; //度数 }Node; Node ArrDegree[m]; //m+1为顶点个数 For(i =0; i ArrDeg

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

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

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时查看传进来的参数是什么,以后可以判断遇到这样的参数是就是关

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

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