图的深度优先遍历(递归与非递归算法)和广度优先遍历

老师的题目::

实验内容

已知某地区的公路网以图表示,图中的顶点表示站点,任意两站点间的路段以带权的边构成的邻接矩阵表示,矩阵中非零元表示两个站点间存在直接的路段,否则没有路段。

打开E:\Test文件夹中的exp06.cpp文件,补充编写所需代码。程序首先进行图的连通性判定,若图连通则输出连通信息,否则继续计算和输出图的连通分量数。

输入数据在文件exp06.in中,首行的整数是站点的总数n(1

6

01 3 4 9 0

10 9 9 0 0

39 0 0 6 8

49 0 0 5 7

90 6 5 0 4

00 8 7 4 0

主函数中,在调用读入数据函数readData()时,会自动将矩阵中的零元(除对角线保持0以外)替换成无穷大(9999)。

Search(intv)函数实现从顶点v出发的一次搜索过程,并累计访问顶点数。

若图是连通的,则输出文件exp06.out中包含如下文字:

All vertexsare connected.

否则,计算和输出连通分量数,输出文件的内容则如下例:

    The number of connected components is 2.

解题思路

利用一次深度优先或者广度优先搜索过程中对访问顶点数的计数,并判断其与图的顶点总数是否相等来判定图的连通性。

如果图不连通,则继续从下一个未被访问的顶点出发再进行一次搜索,如此反复,直到已遍历图的所有顶点,累计的搜索次数即是图的连通分量数。

我在代码中都做了注解


#include 
#include 
using namespace std;

const int Size=30;
const double INF=9999;		// infinity (无穷大)
int vexnum;					// total number of vertex (顶点总数) 
int adjmat[Size][Size];		// adjacent matrix (邻接矩阵)
int mark[Size];				// vector of visiting mark of vertex (顶点访问标记向量)
int visitnum;				// number of visited vertex for one search (一次搜索中被访问顶点数)
int adjnum;					// number of connected components (连通分量数) 

void readData()
{	int i,j;
	cin>>vexnum;			// input vexnum 
	for(i=0; i>adjmat[i][j];
			if(i!=j && adjmat[i][j]==0) adjmat[i][j]=INF;
		}
}
/*int first_adj(int v){
	int w;
	for(w=0;w



你可能感兴趣的:(图的深度优先遍历(递归与非递归算法)和广度优先遍历)