欧拉图实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计实验报告
课题名称欧拉图的判断
第一章需求分析
欧拉图源于柯尼斯堡七桥问题:同构图中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,同构图中所有边一次且仅一次行遍图中所有顶点的回路称为欧拉回路,具有欧拉通路而没有欧拉回路的图称为半欧拉图。
类似哈密尔顿图,欧拉图是关于连通图的问题,不过是关于边的连通图。
第二章概要设计
1.实现方法
正如哈密尔顿图的判定中建立关于定点的联通图,对于欧拉图我们建立了关于边的类似连通图,同样也是借助深度优先算法递归得到答案。
1)从图中某点出发,依次搜索与该顶点相关联且未访问的边,若存在则该点入栈
并标记为已被访问,计入入栈元素个数。
2)从当前边的另一邻接点出发,只要入栈元素个数不大于边总数且栈不为空就重
复前两步,递归深度优先,直到所有边都被访问。
3)若递归完成后入栈元素个数小于边总数,或者最终到达的边的另一邻接点不是
出发点,则将所有顶点设置为未被访问,回溯到第一步。
2.各个模块及其功能:
基础模块(头文件内容)
Bool Visite[]标志访问数组
+(void)(*VisitFunc)(VertexType v)//全局定义
EBox:
-(bool) mark
-(int) ivex, jvex
-(EBox)*ilink, *jlink//call back
-(InfoType)*info
VexBox:
-(VertexType)data
-(EBox)*firstedge
AMLGraph:
-(VexBox)adjmulist[]//邻接表
-(int)vexnum, edgenum
-()Graphkind
+(VexBox[?])LocateVex(input)//返回点位置+()CreateGraph()
+()DestroyGraph()
+()GetVex()+()PutVex()
+()InsertArc()
+()DeleteArc(VetexType v,w) 删除
+()DeleteVex(v)删除点v
+()DFS(v)//以v开始深度优先
+()MarkUnvizited()
+()Display()
附流程图
第三章详细设计#include
{
cout << i;
}
typedef EBox * SElemType;
#include"SqStack.h"
void OLDFS( AMLGraph &G, int v, int &u, int &count, SqStack &S, bool &tag) {
EBox *p;
if ( count < G.edgenum )
{
p = G.adjmulist[ v ].firstedge;
while ( ! tag && p )
{
if ( ! p->mark )
{
PushSqStack( S, p );
p->mark = true;
count++;
if ( v == p->ivex )
{
OLDFS( G, p->jvex, u, count, S, tag );
if ( ! tag )
{
count--;
PopSqStack( S, p );
p->mark = false;
if ( p->ivex == v )
p = p->ilink;
else
p = p->jlink;
}
}
else
{
OLDFS( G, p->ivex, u, count, S, tag );
if ( ! tag )
{
count--;
PopSqStack( S, p );
p->mark = false;
if ( p->ivex == v )
p = p->ilink;
else
p = p->jlink;
}
}
}
else
if ( v == p->ivex )
p = p->ilink;
else
p = p->jlink;
}
}
else if ( count == G.edgenum && v == u )
tag = true;
}
void HalfOLDFS( AMLGraph &G, int v, int &count, SqStack &S, bool &tag ) {
EBox *p;
if ( count < G.edgenum )
{
p = G.adjmulist[ v ].firstedge;
while ( ! tag && p )
if ( ! p->mark )
{
PushSqStack( S, p );
p->mark = true;
count++;
if ( v == p->ivex )
{
HalfOLDFS( G, p->jvex, count, S, tag );
if ( ! tag )
{
count--;
PopSqStack( S, p );
p->mark = false;
if ( p->ivex == v )
p = p->ilink;
else
p = p->jlink;
}
}
else