武汉纺织大学《数据结构》实验报告Word下载.doc
《武汉纺织大学《数据结构》实验报告Word下载.doc》由会员分享,可在线阅读,更多相关《武汉纺织大学《数据结构》实验报告Word下载.doc(23页珍藏版)》请在冰豆网上搜索。
③、输出从顶点'
A'
开始的深度优先遍历和广度优先遍历的序列,可参考书本238、240页示例程序;
④、输出运用普里姆算法求出的最小生成树,可参考书本245页示例程序。
2、设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
实验步骤:
①、在Java语言编辑环境中新建程序,输入如下图所示的AOE网;
②、按照关键路径求取步骤,求出各个顶点的最早开始时间和最迟开始时间;
③、求出各个活动的最早开始时间和最迟开始时间;
④、找出该AOE网的关键路径,并计算出该项目的完成时间。
关键路径相关时间知识点:
设活动ai由弧<
j,k>
(即从顶点j到k)表示,其持续时间记为dut(<
),则:
e(i)=ve(j)l(i)=vl(k)-dut(<
)
求ve(i)和vl(j)分两步:
(1).从ve
(1)=0开始向前递推
ve(j)=Max{ve(i)+dut(<
i,j>
)}<
∈T,2<
=j<
=n,其中,T是所有以j为弧头的弧的集合。
(2).从vl(n)=ve(n)开始向后递推
vl(i)=Min{vl(j)-dut(<
)}<
∈S,1<
=i<
=n-1,其中,S是所有以i为弧尾的弧的集合。
求关键路径的算法:
①、输入e条弧<
j,k>
,建立AOE网的存储结构;
②、从起始点出发,令ve[0]=0,按拓扑顺序求其余各顶点的最早发生时间ve[i](1<
=n-1)。
如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止,否则转到步骤③;
③、从终结点vn出发,令vl[n-1]=ve[n-1],按逆拓扑顺序求其余各顶点的最迟发生时间vl[i](n-2>
=i>
=0);
④、根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。
若某弧满足条件e(s)=l(s),则为关键活动。
三、操作步骤:
Test1
代码:
Graph1.java
packageFrist;
publicclassGraph1{
publicstaticvoidmain(String[]args){
String[]vertices={"
A"
"
B"
C"
D"
E"
};
Edgeedges[]={newEdge(0,1,5),newEdge(0,3,2),
newEdge(1,0,5),newEdge(1,2,7),newEdge(1,3,6),
newEdge(2,1,7),newEdge(2,3,8),newEdge(2,4,3),
newEdge(3,0,2),newEdge(3,1,6),newEdge(3,2,8),
newEdge(3,4,9),newEdge(4,2,3),newEdge(4,3,9)};
AdjMatrixGraph<
String>
graph=newAdjMatrixGraph<
(vertices,
edges);
System.out.println("
带权无向图,"
+graph.toString());
插入顶点F,插入边(A,F,20),删除顶点C,删除边(D,E)"
);
inti=graph.insertVertex("
F"
graph.insertEdge(0,i,20);
graph.insertEdge(i,0,20);
graph.removeVertex
(2);
graph.removeEdge(2,3);
graph.removeEdge(3,2);
System.out.println(graph.toString());
graph1=newAdjMatrixGraph<
System.out.print("
深度优先遍历序列为:
"
graph1.DFSTraverse(0);
广度优先遍历序列为:
graph1.BFSTraverse(0);
graph2=newAdjMatrixGraph<
+graph2.toString());
graph2.minSpanTree_prim();
}
}
LList.java
publicinterfaceLList<
T>
{
booleanisEmpty();
intlength();
Tget(inti);
voidset(inti,Tx);
voidinsert(inti,Tx);
Tremove(inti);
voidremoveAll();
QQueue.java
publicinterfaceQQueue<
voidenqueue(Tx);
Tdequeue();
SeqList.java
publicclassSeqList<
implementsLList<
privateObject[]element;
privateintlen;
publicSeqList(intsize){
this.element=newObject[size];
this.len=0;
publicSeqList(){
this(64);
publicbooleanisEmpty(){
returnthis.len==0;
publicintlength(){
returnthis.len;
publicTget(inti){
if(i>
=0&
&
i<
this.len)
return(T)this.element[i];
returnnull;
publicvoidset(inti,Tx){
if(x==null)
return;
this.element[i]=x;
else
thrownewIndexOutOfBoundsException(i+"
publicStringtoString(){
Stringstr="
("
;
if(this.len>
0)
str+=this.element[0].toString();
for(inti=1;
this.len;
i++)
str+="
"
+this.element[i].toString();
returnstr+"
)"
publicvoidinsert(inti,Tx){
if(this.len==element.length){
Object[]temp=this.element;
this.element=newObject[temp.length*2];
for(intj=0;
j<
temp.length;
this.element[i]=temp[j];
}
if(i<
i=0;
i=this.len;
for(intj=this.len-1;
j>
=i;
j--)
this.element[j+1]=this.element[j];
this.element[i]=x;
this.len++;
publicvoidappend(Tx){
insert(this.len,x);
publicTremove(inti){
if(this.len==0||i<
0||i>
=this.len)
returnnull;
Told=(T)this.element[i];
for(intj=i;
this.len-1;
j++)
this.element[j]=this.element[j+1];
this.element[this.len-1]=null;
this.len--;
returnold;
publicvoidremoveAll(){
SeqQueue.java
publicclassSeqQueue<
implementsQQueue<
privateObjectelement[];
privateintfront,rear;
publicSeqQueue(intlength){
if(length<
64)
length=64;
this.element=newObject[Math.abs(length)];
this.front=this.rear=0;
publicSeqQueue(){
publicbooleanis