1、网络流宇宙旅行软件综合课程设计 网络流:宇宙旅行图书借阅管理系统 二一四 年 六 月数据结构课程设计报告一、网络流:宇宙旅行1问题陈述在走遍了地球上的所有景点以后,旅游狂人开始计划他的宇宙旅行项目。经过谨慎调查,他目前掌握了一张各卫星空间站可以临时容纳的旅客人数列表。但旅客从一个星球飞往另一个星球时,需要在若干卫星空间站临时停靠中转,而这些空间站不能接待任何旅客驻留,旅客必须立刻转乘另一艘飞船离开,所以空间站不能接待超过自己最大容量的旅客流。为了估计预算,现在旅游狂人需要知道终点星球的接待站应该设计多大容量,才能使得每艘飞船在到达时都可以保证让全部旅客下船。输入要求:输入若干组测试数据组成。每
2、组测试数据的第1行包含旅行的起点星球和终点星球的名称和一个不超过500的正整数N(N为0标志全部测试结束,不要对该数据做任何处理)。接下来的N行里,数据格式为:sourcei capacityi ,其中sourcei和destinationi是卫星空间站的名称或起点、终点星球的名称,正整数capacityi是飞船从sourcei到destinationi一次能运载的最大旅客流量。每个名称是由AZ之间三个大写字母组成的字符串,例如:ZJU。测试数据中不包含任何到达起点星球的信息以及任何从终点星球出发的信息。输出要求:对每一组测试,在一行里输出终点星球接待站应具有的最小容量,使得每艘飞船在到达时都
3、可以保证让全部旅客下船。2程序代码(一部分)#include #include Graph.h#include Queue1.h#define N 10 / Construction/Destruction/typedef int dataType; /抽象数据类型dataType定义为intGraph:Graph() /初始化图的结点集合和邻接矩阵 int i,j; for(i=0;iMaxSize;i+) /初始化图的结点集合 vertexi= ; for(i=0;iMaxSize;i+) /初始化图的邻接矩阵 for(j=0;jMaxSize;j+) if(i=j) matij=0; /
4、数据元素权值为0 else matij=MaxCost; /权值为无穷大 vertCount=0; /当前结点数为0 edgeCount=0; /当前边数为0Graph:Graph() void Graph:createGraph(int n,char vert,int m,EdgeNode1 edge) /以结点集合和边集合构造一个图 vertCount=n; /图的结点个数 int i,j,k; for(i=0;in;i+) /初始结点加入结点集合 vertexi=verti; edgeCount=m; /图的边数 for(k=0;km;k+) /初始边值加入邻接矩阵 i=edgek.in
5、it; /边的起点 j=edgek.end; /边的终点 matij=edgek.weight; /边的权值 void Graph:unvisited() /设置未访问标记 for(int i=0;ivertCount;i+) visitedi=0;ostream& operator(ostream& out,Graph &g1) /输出图的结点集合和邻接矩阵 cout图的结点集合为 ; int i,j; for(i=0;ig1.vertCount-1;i+) coutg1.vertexi, ; coutg1.vertexiendl; cout图的邻接矩阵为endl; for(i=0;ig1.
6、vertCount;i+) for(j=0;jg1.vertCount;j+) if(g1.matij=MaxCost) /权值为无穷大时 coutt; else coutg1.matij t; coutendl; return out;/顺序循环队列类图的广度优先遍历算法中,同样需要使用成员变量visited数组。算法实现如下:void Graph:breadthfs(int k) /从结点k开始的广度优先遍历 /k为起始结点下标 Queue1 q1(vertCount); /设置空队列 int i=k; char *vertN=EAR,AAA,BBB,CCC,DDD,EEE,FFF,GGG
7、,DFE,EAM; coutverti ; /访问起始结点 visitedi=1; /设置访问标记 q1.enQueue(i); /访问过的结点k入队 while(!q1.isEmpty() /队列不空时 i=q1.deQueue(); /出队,i是结点k的数组下标 int j=0; while(j0 & matijMaxCost & visitedj=0) coutvertj ; /访问结点 visitedj=1; q1.enQueue(j); /入队 else j+; void Graph:breadthFirstSearch() /图的广度优先遍历 /k为起始结点下标 cout请按照以下
8、代号所提供的景点参观:endl; int k=0; unvisited(); breadthfs(k); coutendl; void Graph:depthfs(int k) /从结点k开始的深度优先遍历 int i=k,j=0; /i下标从0开始 char *vertN=EAR,AAA,BBB,CCC,DDD,EEE,FFF,GGG,DFE,EAM; coutverti ; /访问结点 visitedi=1; /设置访问标记 while(j0 & matijMaxCost & visitedj=0) depthfs(j); /递归 else j+;void Graph:depthFirst
9、Search() /图的深度优先遍历 cout请按照以下代号所提供的景点参观:endl; int k=0; unvisited(); /设置未访问标记 depthfs(k); coutendl;/求原点到某一点的最短路径/void Graph:ShortestPath_1(Graph &G) /v0顶点到其余结点的最短距离Pv及路径长度Dv int i,v,w,pre,min,v0=0; int finalMaxSize; int *P,*D; char *vertN=EAR,AAA,BBB,CCC,DDD,EEE,FFF,GGG,DFE,EAM; D=new intG.vertCount;
10、P=new intG.vertCount; for(v=0;vG.vertCount;+v) Dv=G.matv0v; if(Dv!=MaxCost) Pv=v0; else Pv=0; for(i=0;iG.vertCount;i+) finali=0; finalv0=1; /开始主循环,每次求得v0到某个v顶点的最短路径,并加v到集合 for(i=1;iG.vertCount;+i) min=MaxCost; for(w=0;wG.vertCount;+w) if(!finalw) & (Dwmin) /w在顶点V-S中 min=Dw; v=w; finalv=1; for(w=0;wD
11、v+G.matvw) Dw=Dv+G.matvw; Pw=v+1; cout 您现在的位置是0:地球宇宙旅行服务中心endl; cout -endlendl; for(i=0;iG.vertCount;i+) cout 到达景点verti的路径长度:Diendl; pre=Pi; cout 路径如下:verti; while(pre!=0) cout-verti; pre=Ppre-1; cout-vert0endl; cout终点需要的容量在各个景点介绍中涉及-endl;/建立最小生成树/void Graph:MiniSpanTree_PRIM(Graph &G) /从序号为0的顶点出发,建
12、立最小生成树,n为结点个数,存于数组closevertex中 int lowcostMaxSize,mincost; int i,j,k; int *closevertex; char *vertN=EAR,AAA,BBB,CCC,DDD,EEE,FFF,GGG,DFE,EAM; closevertex=new intG.vertCount; coutendl请参照如下路径参观:endl; for(i=1;iG.vertCount;i+) lowcosti=G.mat0i; closevertexi=1; lowcost0=0; closevertex0=1; k=1; int bMaxSiz
13、e,a=0; coutvert0; for(i=1;iG.vertCount;i+) mincost=MaxCost; j=1; while(jG.vertCount) if(lowcostj!=0 & lowcostjmincost) mincost=lowcostj; k=j; j+; coutvertk; bi=mincost; lowcostk=0; for(j=1;jG.vertCount;j+) if(G.matkjlowcostj) lowcostj=G.matkj; closevertexj=k+1; for(i=1;iG.vertCount;i+) a+=bi; couten
14、dl总距离:a宇宙距离endl; cout终点站需要500的容量BI; BookInfo* t; BookInfo* m; do input:输入图书编号; if(m=SearchBook(S,Tempcode) input:这类书已有库存.n输入图书的入库量 m-b_Total+=num; else t=(BookInfo*)malloc(sizeof(BookInfo); t-b_Code=Tempcode; input:输入图书的名称:; input:输入图书价格:; input:输入图书的入库量:; t-b_Out=0; t-nextbook=p-nextbook; p-nextboo
15、k=t; S-BookTotal+; while(1); 查询图书BookInfo* SearchBook(System* S,int code)BookInfo* bi=S-BI-nextbook;int bookcode;if(code=-1) input:请输入要查询的图书编号:; else bookcode=code; while(bi&bi-b_Code!=bookcode)bi=bi-nextbook; if(code=-1) if(!bi)cout没找到你所要的图书.endl; else input:图书编号为:b_Code input:图书名称为:b_Name input:图书
16、价格为:b_price input:借阅人编号为:b_person input:图书库存量为:b_Total input:图书借出量为:b_Out return bi; 删除图书 void DelBook(System* S) BookInfo* bi; BookInfo* pl=S-BI; MemberInfo* memi;do pl=S-BI; bi=pl-nextbook; memi=S-MI-nextmember; input:请输入要删除的图书的编号:; while(bi) if(bi-b_Code=tempcode)break; pl=bi; bi=bi-nextbook; if(
17、bi=0) input:没有找到要删除的图书; else pl-nextbook=bi-nextbook; S-BookTotal-; while(memi) for(i=1;il_Codes0;i+) if(memi-l_Codesi=tempcode)break; if(il_Codes0) for(;il_Codes0;i+)memi-l_Codesi=memi-l_Codesi+1; memi-l_Codes0-; memi=memi-nextmember; free(bi); input:还有图书要删除吗?(Y/N); if(sel=N|sel=n) input:删除图书结束! re
18、turn; while(1); 借书处理void BorrowBook(System* S) BookInfo* bi=S-BI-nextbook; BookInfo* p; MemberInfo* mp; do input:输入要借出的书号:; p=SearchBook(S,tempcode); if(!p) input:没有找到要借出的图书. else input:此书的现存量为b_Total-p-b_Out); if(!(p-b_Total-p-b_Out)cout0.endl;/已借出 else input:请输入会员编号:; mp=SearchMember(S,memcode); i
19、f(!mp) input:会员编号输入错误,外借失败l_Codes0=5) input:借书量不能超过5本; else p-b_Out+; mp-l_Codes+mp-l_Codes0=tempcode; input:外借成功. p-b_person=mp-m_Code; input:n还有图书要借出吗?(Y/N); if(sel=N|sel=n) input:外借操作结束. return; while(1);还书处理void TurnBackBook(System* S) BookInfo* bi=S-BI-nextbook; BookInfo* p; MemberInfo* mp;do i
20、nput:输入归还书号:; p=SearchBook(S,tempcode); if(!p) input:书号输入错误.; else input:此书的现存量为b_Total-p-b_Out); input:请输入会员编号:; if(!(mp=SearchMember(S,membercode) input:会员编号输入错误,归还失败b_Out-; for(i=1;il_Codes0;i+) if(mp-l_Codesi=tempcode)break; while(il_Codes0) mp-l_Codesi=mp-l_Codesi+1; i+; mp-l_Codes0-; input:还有要归还的图书吗?(Y/N); if(sel=N|sel=n) input:归还
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1