19、求连通图的一棵生成树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学与计算机学院

课程设计说明书课程名称: 算法设计与分析-课程设计

课程代码: 7106620

题目: DFS,BFS求生成树

年级/专业/班:

学生姓名:

学号:

开始时间:2010 年12 月27 日完成时间:2011 年01月07日课程设计成绩:

学习态度及平时成绩(30)技术水平与实际能

力(20)

创新(5)说明书撰写质量(45)

总分

(100)

指导教师签名:年月日

目录

1 引言 (1)

1.1 问题的提出 (1)

1.3任务与分析 (1)

2 基本的准备 (1)

3 程序运行平台 (2)

4详细设计 (2)

4.1主要数据结构类型 (2)

4.2 DFS的实现 (2)

4.3 BFS的实现 (3)

4.4 写直线DDA算法的实现 (3)

5系统测试 (6)

结论 (13)

致谢 (14)

参考文献 (15)

摘要

DFS和BFS是对图进行遍历的最基本的两种方法,通过这样的两种遍历生成结果也是两种结果,生成树的结果显示出来也会是两种结果。该结果用图形化显示的结果更明显。

DFS和BFS无论是在树的搜索和图的搜索都有广泛的运用,一位大牛说过所有的问题都可以规划为图的问题,而DFS和BFS是最简单的搜索和遍历的一种算法。

关键词:DFS,BFS,图形化

1 引言

1.1 问题的提出

1.设计内容:

给出一个可以抽象为图的实例,用深度优先和广度优先法求连通图的一棵生成树。

2.设计要求:

(1)给出实例;

(2)给出上述两种算法;

(3)编写程序实现生成树的求解;

(4)以图形化界面表现实例并显示求解结果。

1.2国内外研究的现状

由于国内程序员存在着一个普遍对算法的重视不够,导致国内程序员中下水平的程序员过多,也导致了所有IT就业难的难点,对计算机算法是一个程序员终身也必须需要学习的事情,该DBS和BFS就是最基本的图或者的树的一种算法,显然国外的研究状况比国内良好得多。

1.3任务与分析

(1):首先需要写出图形化如何显示点和边。

(2):用一数组保存写入的点和边的信息。

(3):分别写出正确的DFS和BFS。

(4):正确的显示生成树的结果

2 基本的准备

2.1点的图形化的显示

在这个过程中显示点的最好方法是将点包含属性x左边和y左边,然后在窗口中显示出来。

2.2边的图形化的显示

在这个过程中显示边使用的算法是DDA算法,由于这个画边不是该课题的重点,所以拷用的是过去所写的dda的算法函数模块。

3 程序运行平台

Vc++6.0 微软出品,运行的是MFC。

4详细设计

4.1主要数据结构类型

struct tu //结构体

{

int x;

int y;

int name;

};

tu max[50];

int gr[50][50] = {0};

int n = 0;

4.2 DFS的实现

void dfs(int sta ,int sheng[50][50],bool visit[50]) //dfs生成树{

int i;

visit[sta] = true;

for(i = 0 ; i < n ; i++)

if( visit[i] == false && gr[sta][i] == 1)

{

sheng[sta][i] = 1;

sheng[i][sta] = 1;

dfs(i,sheng,visit);

}

}

void dfstree(int sheng[][50],int start)

{

bool visit[50];

int i,j;

for(i = 0 ; i < n ; i++)

visit[i] = false;

dfs(start,sheng,visit);

}

4.3 BFS的实现

int total(bool x[],int n)//统计还没有进入被树连接的点数

{

int total = 0;

for(int i = 0 ; i < n ; i ++)

if(x[i] == false)

total++;

return total;

}

void bfs(int sta,int sheng[][50]) //bf生成树

{

bool visit[50];

int i;

int a[50];//堆栈

int ai = 0 ; //堆栈控制

for(i = 0 ; i < n ; i++)

visit[i] = false;

visit[sta] = true;

a[ai++] = sta;

while(total(visit,n) != 0)

{

int index = a[ai--];

for(i = 0 ; i < n ; i++)

{

if(gr[index][i] == 1 && visit[i] == false)

{

visit[i] = true;

a[ai++] = i;

sheng[index][i] = 1;

sheng[i][index] = 1;

}

}

}

}

4.4 写直线DDA算法的实现

void CGView::Line_DDA(long p1x,long p1y,long p2x,long p2y,CDC *pDC)//画直线算法实现

{

int x,y;

float k,dx,dy,xa,ya;

相关文档
最新文档