实验四图地深度优先与广度优先遍历Word格式.docx
《实验四图地深度优先与广度优先遍历Word格式.docx》由会员分享,可在线阅读,更多相关《实验四图地深度优先与广度优先遍历Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
intvexnum,arcnum;
/顶点的实际数,边的实际数ALGraph;
4)注意问题:
注意理解各算法实现时所采用的存储结构。
注意区别正、逆邻接。
2.拓扑排序:
给出一个图的结构,输出其拓扑排序序列(顶点序列用空格隔开),要求在同等条件下,编号小的顶点在前。
3利用最小生成树算法解决通信网的总造价最低问题1)问题描述:
若在n个城市之间建通信网络,架设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网络的最小生成树问题。
2)实验要求:
利用Prim算法求网的最小生成树。
3)实现提示:
通信线路一旦建立,必然是双向的。
因此,构造最小生成树的网一定是无向网。
为简单起见,图的顶点数不超过10个,网中边的权值设置成小于100。
三、实验过程与实验结果应包括如下主要容:
数据结构定义图是由定点集合及定点间的关系集合组成的一种数据结构,其形式化定义为Graph=(V,E)其中,V=x|x某个数据对象是定点的有限非空集合;
E=(x,y)|x,yVPath(x,y)是顶点之间关系的有限集合,叫做便集。
集合E中的Path(x,y)表示顶点x和顶点y之间有一条直接连线,即(x,y)表示一条边,它是有方向的。
算法设计思路简介算法描述:
可以用自然语言、伪代码或流程图等方式1、图的深度优先搜索:
在访问图中某一起始点V后,由V出发,访问它的任一邻接顶点w1;
再从w1;
出发,访问与w1邻接但还没有访问过得顶点w2;
然后再从w2出发,进行类似的访问,,如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止;
接着退回一步,回溯到u的前一个邻接顶点,看它是否还有其他没有被访问过的邻接点。
如果有,则访问此邻接点,之后再从此顶点出发,进行与前述类似的访问;
如果没有,就再退回一步进行搜索。
重复上述过程,直至图中所有和V连通的顶点都被访问到。
若此时图有顶点未被访问,则说明该图不是连通图,另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问过为止。
图的广度优先搜索:
使用广度优先搜索(BFS)在访问了起始顶点V之后,由V出发,依次访问V的各个未曾被访问过的邻接点w1,w2,wt,然后再顺序访问w1,w2,wt,的所有还为访问过的邻接点。
再从这些顶点出发,访问它们还未访问过的邻接点,如此做下去,直到图中所有顶点都被访问过为止。
2、
(1)将没有前驱(入度为零)的顶点进栈。
(2)从栈中退出栈顶元素输出,并把该顶点引出的所有弧删去,即把它的各个邻接点的入度减1,同时将当前已输出的顶点个数加1.(3)将新的入度为零的顶点再进栈。
(4)重复
(2)、
(2)两步,直到栈为空为止。
此时或者已经输出前部顶点,或者剩下的顶点中没有入度为零的顶点。
3、设置一个n*n的矩阵A(k),其中除对角线元素为0外,其他元素A(k)ij表示顶点i到顶点j的路径长度,k表示运算步骤。
开始时k=-1,A(-1)ij=arcsij,即A为图的邻接矩阵。
以后逐步尝试在原路径中加入其他顶点作为中间点,如果增加中间点顶点后,得到的路径比原来的路径短,则以此新路径代替原来路径,修改矩阵元素。
具体做法为:
第0步让所有路径上加入中间点0,去Aij与Ai0+Aoj中较小的值作Aij的新值,完成后得到A(0)如此进行下去,当第n-1步完成后,得到A(n-1),A(n-1)即为所求的结果,A(n-1)ij表示从i到j路径上的中间顶点的序号小于或等于n-1的最短路径的长度,即A(n-1)ij表示从i到j的最短路径的长度。
算法的实现和测试结果:
包括算法运行时的输入、输出,实验中出现的问题及解决办法等1、2、3、算法时间复杂度分析1、深度优先遍历:
O(n*n).广度优先遍历:
O(n*n).2、O(n+e).3、O(n*n*n).四、收获与体会不想说什么,这章的程序太难了,每次一想起来数据结构还没做就烦,前两个题基本上一天能做一道题,第三题也就是骗骗OJ,实际上还有个小BUG,等有空再写个真正符合题意的程序吧。
五、源代码清单1、#includeusingnamespacestd;
#defineINFINITYINT_MAX#defineMAX_VERTEX_NUM20/typedefenumDG,DN,AG,ANGraphKind;
typedefintElemtype;
typedefstructQueueNodeElemtypedata;
structQueueNode*next;
QueueNode;
typedefstructQueueListQueueNode*front;
QueueNode*rear;
QueueList;
QueueList*CreateQueue()QueueList*Q;
QueueNode*p;
Q=(QueueList*)malloc(sizeof(QueueList);
p=(QueueNode*)malloc(sizeof(QueueNode);
Q-front=Q-rear=p;
Q-front-next=NULL;
returnQ;
boolQueueEmpty(QueueList*Q)if(Q-front=Q-rear)returntrue;
elsereturnfalse;
QueueList*EnQueue(QueueList*Q,intelement)QueueNode*p;
p-data=element;
p-next=NULL;
Q-rear-next=p;
Q-rear=p;
QueueList*DeQueue(QueueList*Q,Elemtype*e)QueueNode*temp;
if(!
QueueEmpty(Q)temp=Q-front-next;
*e=temp-data;
Q-front-next=temp-next;
if(Q-rear=temp)Q-rear=Q-front;
free(temp);
voiddisplay(QueueList*Q)QueueNode*temp;
temp=Q-front;
QueueEmpty(Q)while(temp-next!
=NULL)temp=temp-next;
coutdataendl;
typedefstructArcintadj;
Arc,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;
typedefstructintvertexMAX_VERTEX_NUM;
AdjMatrixarcs;
/GraphKindkind;
Graph;
voidCreateAG(Graph&
G,intn,intm)inti,j;
G.vexnum=n;
G.arcnum=m;
for(i=0;
in;
i+)G.vertexi=i+1;
i+)for(j=0;
jn;
j+)G.arcsij.adj=0;
for(intk=0;
kij;
G.arcsi-1j-1.adj=G.arcsj-1i-1.adj=1;
boolvisitedMAX_VERTEX_NUM;
intcount=0;
voidDFS(GraphG,intv)visitedv-1=true;
count+;
coutv;
if(countG.vexnum)cout;
for(inti=v;
iG.vexnum;
i+)if(G.arcsv-1i.adj!
=0&
!
visitedi)DFS(G,G.vertexi);
voidDFSTraverse(GraphG)intv=0;
for(v=0;
vG.vexnum;
v+)visitedv=false;
v=1;
/遍历入口点DFS(G,v);
voidBFS(GraphG)inti,j;
intk=0;
intv=0;
intu=0;
QueueList*queue;
queue=CreateQueue();
EnQueue(queue,v);
visitedv-1=true;
while(!
QueueEmpty(queue)DeQueue(queue,&
u);
k+;
coutu;
if(kG.vexnum)cout;
for(inti=u;
inm;
CreateAG(G1,n,m);
DFSTraverse(G1);
coutendl;
BFS(G1);
return0;
2、#includeusingnamespacestd;
#defineINFINITYINT_MAX#defineMAX_VERTEX_NUM20typedefintElemtype;
typedefstructArcNodeintadjvex;
ArcNode;
typedefstructVNodeintdata;
VNode,AdjListMAX_VERTEX_NUM;
typedefstructAdjListvertex;
voidCreateDN(Graph&
G,inte,intn)inti,j;
G.arcnum=e;
i+)G.vertexi.data=i+1;
G.vertexi.firstarc=NULL;
ArcNode*s,*p;
s=(ArcNode*)malloc(sizeof(ArcNode);
s-adjvex=j-1;
s-nextarc=NULL;
if(G.vertexi-1.firstarc=NULL)G.vertexi-1.firstarc=s;
elsep=G.vertexi-1.firstarc;
while(p-nextarc!
=NULL)p=p-nextarc;
p-nextarc=s;
voidFindInDegree(GraphG,intindegree)inti;
ArcNode*p;
i+)indegreei=0;
iadjvex+;
p=p-nextarc;
voidTopologicalSort(GraphG)inti,k,count,indegreeMAX_VERTEX_NUM;
i+)visitedi=false;
count=0;
FindInDegree(G,indegree);
while(countG.vexnum)for(i=0;
i+)if(indegreei=0&
visitedi=false)coutG.vertexi.data;
if(countG.vexnum-1)coutnextarc)k=p-adjvex;
indegreek-;
break;
intmain()intn;
/节点数intm;
/关系数cinnm;
GraphG1;
CreateDN(G1,m,n);
TopologicalSort(G1);
3、#includeusingnamespacestd;
#defineINFINITY1000#defineMAX_VERTEX_NUM20typedefintElemtype;
voidCreateAN(Graph&
intw=0;
j+)G.arcsij.adj=INFINITY;
kijw;
if(G.arcsi-1j-1.adjw)G.arcsi-1j-1.adj=G.arcsj-1i-1.adj=w;
voidFloyd(GraphG,intn,intm)inti,j;
intmax=0;
intAMAX_VERTEX_NUMMAX_VERTEX_NUM;
intpathMAX_VERTEX_NUMMAX_VERTEX_NUM;
j+)Aij=G.arcsij.adj;
if(AijINFINITY)pathij=i;
elsepathij=0;
intt;
intsum;
i+)t=0;
sum=0;
for(j=0;
j+)if(Aij=n-1&
sum20)coutsum;
exit(0);
elsecontinue;
kn;
k+)for(i=0;
j+)if(Aik+AkjAij)Aij=Aik+Akj;
pathij=pathkj;
/cout处|理后endl;
/for(i=0;
i+)/for(j=0;
j+)/if(AijINFINITY)/coutAijt;
/else/cout0t;
/coutendl;
/coutpath:
endl;
j+)/coutpathijt;
jmax)max=Aij;
coutmax;
/遍历入?
口点?
DFS(G,v);
CreateAN(G1,n,m);
if(m=0)cout0;
elseFloyd(G1,n,m);