19、求连通图的一棵生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;