資源簡介
在Microsoft Visual C++ 上運行沒有錯誤;
包括論文word文檔、論文答辯的ppt、流程圖.vsd等;
SERCOI工程組是一個講究效率的工程小組。為了規(guī)劃和管理的方便,他們將一個工程分為若干個項目,每個項目都可以獨立進行。所有項目都工作完畢時,整個工程也就完成了。每個項目都需要一定的工作時間。工程最后總耗時是從第一個項目開始到最后一個項目結束的這段時間。
各個項目之間可能存在也可以不存在相互制約關系。如果有制約關系,則可能是以下四種之一(設兩個項目分別為p和q):
(1)SAS p q (p Sart After q Start,項目p在項目q開始之后才能開始)
(2)FAS p q (p Finish After q Start,項目p在項目q開始之后才能結束)
(3)SAF p q (p Sart After q Start,項目p在項目q結束之后才能開始)
(4)FAF p q (p Finish After q Start,項目p在項目q結束之后才能結束)
如果沒有制約關系,則可同時進行。
例如:SAF 1 3表示項目1必須在項目3完成后才能開始。若項目3工作時間為3,起始時刻為2,則項目1最早在時刻5才能開始。
作為SERCOI小組的項目負責人,請你根據(jù)各個項目的工作時間及先后關系,找出一種安排工程的方案,使整個工程盡可能快的完成。
輸入:
輸入文件的第一行為項目總數(shù)N(1≤N≤100),設項目的編號依次為1,2,…,N。下面N行依次為完成每個項目所需的工作時間(每個項目占一行)。這個時間為不超過100的正整數(shù)。
接下來若干行是一些項目間先后次序關系的列表,每行的格式為:
其中:為SAS、FAS、SAF、FAF中的任意一個,“(”表示一個空格符。
整個文件以一個字母“#”表示結束(單獨占一行)
輸出:
若問題有解,則輸出文件有N行,依次輸出項目1到項目N的最早開始時間(設整個工程從0時刻開始)。每行的格式為:(項目編號 最早開始時間)。
若問題無解,則輸出文只有一行,為一個正整數(shù)0。
輸入輸出示例1:
project .in
3
2
3
4
SAF 2 1
FAF 3 2
#
project .out
1 0
2 2
3 1
輸入輸出示例2:
project .in
3
1
1
1
SAF 2 1
SAF 3 2
SAF 1 3
#
project .out
0
思路:用求關鍵路徑算法實現(xiàn)。

代碼片段和文件信息
#include?
#include?
#define?MAX_VERTEX_NUM?30?//圖的最大頂點數(shù)
#define?MAX?30????????????//棧的最大容量
#define?INFINITY?30000;???//定義最大的最遲發(fā)生時間
typedef?struct?ArcNode
{int?adjvex;??????????????//該弧所指向的頂點的位置
?int?weight;??????????????//該弧所代表的活動的持續(xù)時間
?struct?ArcNode?*nextarc;?//指向下一條弧的指針
}ArcNode;???????//弧結點
typedef?struct
{int?indegree[MAX_VERTEX_NUM];?//存放各頂點的入度
?ArcNode*?AdjList[MAX_VERTEX_NUM];?//指向第一條依附該頂點的弧的指針
?int?vexnumarcnum;????????????????//圖的當前頂點和弧數(shù)
}Graph;
typedef?struct????//定義堆棧結構
{int?elem[MAX];???//棧區(qū)
?int?top;?????????//棧頂指針
}Stack;
int?ve[MAX_VERTEX_NUM];??//全局變量,存放各頂點的最早發(fā)生時間
void?CreateGraph(Graph?*G);????//生成圖的鄰接表
int?CriticalPath(Graph?*G);????//求圖的關鍵路徑
int?TopologicalSort(Graph?*GStack?*T);??//進行拓撲排序
void?FindInDegree(Graph?*G);????//求圖各頂點的入度
void?Initial(Stack?*T);?????//初始化一個堆棧
int?Push(Stack?*tint?a);??//將一個元素入棧
int?Pop(Stack?*tint?*a);??//將一個元素出棧
int?Gettop(Stack?*tint?*a);?//得到棧頂元素
int?StackEmpty(Stack?*S);??//判斷堆棧是否為空
void?main()
{Graph?G;??//采用鄰接表結構的圖
?char?j=‘y‘;
?int?t;
?printf(“\t\t\t\t本程序為工程規(guī)劃問題.\n“);
?printf(“首先輸入工程的項目數(shù)(頂點數(shù))和事件數(shù)(弧數(shù)).\n格式為:項目數(shù),事件數(shù);\n“);
?printf(“例如:43\n\n“);
?printf(“接著請輸入各事件(?事件開始點(弧頭)事件結束點(弧尾)?)和事件持續(xù)時間(權值).\n格式:事件開始點,事件結束點,時間持續(xù)時間:\n“);
?printf(“例如:121\n?????232\n?????342\n\n“);
?printf(“該工程最優(yōu)規(guī)劃為:\n“);
?printf(“\n1->2??1\n2->3??2\n3->4??2\n“);
?while(j!=‘N‘&&j!=‘n‘)
??????{
???CreateGraph(&G);??????????//生成鄰接表結構的圖
???????t=CriticalPath(&G);????//尋找G的關鍵路徑
???????if(t==0)?printf(“該工程圖有回路!\n“);
???//若返回為False表明該圖存在有環(huán)路
???????else?printf(“\n“);
???????printf(“是否繼續(xù)新的工程?(Y/N)“);
???????scanf(“?%c“&j);
?????}
}
int?CriticalPath(Graph?*G)
{?????????????????????????//G為有向網(wǎng),輸出G的各項關鍵活動
?int?jdutk=0eeel;
?int?vl[MAX_VERTEX_NUM];?//存放各頂點的最遲發(fā)生時間
?Stack?T;?????//堆棧T存放拓撲排序的頂點序列
?ArcNode?*p;
?Initial(&T);??//初始化堆棧T
?if(!TopologicalSort(G&T))?return(0);?
????//利用拓撲排序求出各頂點的最早發(fā)生時間,并用T返回拓撲序列,
????//若返回False,表明該網(wǎng)有回路
?printf(“該工程最優(yōu)規(guī)劃為:\n\n“);
?Gettop(&T&k);?//k取得拓撲序列的最后一個頂點,即該網(wǎng)的匯點
?vl[k]=ve[k];?//匯點的vl=ve
?for(j=1;j<=G->vexnum;j++)?if(j!=k)?vl[j]=INFINITY;?//將其他的頂點的vl置為IFINITY
?while(!StackEmpty(&T))?//按拓撲逆序求各頂點的vl值
??{Pop(&T&j);
???for(p=G->AdjList[j];p;p=p->nextarc)
?????{k=p->adjvex;
??????dut=p->weight;
??????if(vl[k]-dut ?????????//vl的求法:vl(i)=Min{vl(j)-dut()}?∈Si=n-2...0
?????}
??}
?for(j=1;j<=G->vexnum;j++)??//求每條弧的最早開始時間ee和最遲開始時間el
???for(p=G->AdjList[j];p;p=p->nextarc)
??????{k=p->adjvex;
???????dut=p->weight;
???????ee=ve[j];
???????el=vl[k]-dut;
???????if(ee==el)?printf(“%d->%d%5d\n“jkdut);?//若ee=el,則該弧為關鍵活動
??????}
?return(1);
}
void?CreateGraph(Graph?*G)//構造鄰接表結構的圖G
{
?int?i;
?int?startendarcweight;
?ArcNode?*s;
?printf(“\n現(xiàn)在請輸入您的項目數(shù)和事件數(shù)(頂點數(shù),弧數(shù)):“);
?scanf(“%d%d“&G->vexnum&G->arcnum);?//輸入圖的頂點數(shù)和弧數(shù)
?for(i=1;i<=G->vexnum;i++)?G->AdjList[i]=NULL;?//初始化指針數(shù)組
?printf(“請輸入各事件(?事件開始點(弧頭)事件結束點(弧尾)?)和事件持續(xù)時間(權值).\n格式:事件開始點,事件結束點,時間持續(xù)時間:\n“)
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6225??2009-09-26?12:23??8.c
?????文件???????3339??2009-09-26?18:25??8.dsp
?????文件????????510??2009-09-26?18:25??8.dsw
?????文件??????41984??2009-09-26?18:25??8.ncb
?????文件??????48640??2009-09-26?18:25??8.opt
?????文件????????721??2009-09-26?18:25??8.plg
?????文件?????129536??2009-09-10?15:40??課程設計PPT.ppt
?????文件?????267776??2009-09-11?20:46??課程設計任務書.doc
?????文件??????72192??2009-09-10?14:46??流程圖.vsd
?????文件??????31232??2009-09-26?18:31??工程規(guī)劃題目.doc
?????文件??????33792??2009-09-26?18:25??Debug\vc60.idb
?????文件??????53248??2009-09-26?18:25??Debug\vc60.pdb
?????文件??????13635??2009-09-26?18:25??Debug\8.obj
?????文件?????189168??2009-09-26?18:25??Debug\8.ilk
?????文件?????184395??2009-09-26?18:25??Debug\8.exe
?????文件?????451584??2009-09-26?18:25??Debug\8.pdb
?????文件?????177584??2009-09-26?18:25??Debug\8.pch
?????目錄??????????0??2009-09-26?12:23??Debug
-----------?---------??----------?-----??----
??????????????1705561????????????????????18
評論
共有 條評論