离散实验四解答.docVIP

  • 19
  • 0
  • 约3.13千字
  • 约 9页
  • 2016-12-28 发布于湖北
  • 举报
一、实验目的 判断随机生成的邻接矩阵是否为欧拉图或欧拉半图,若是,求取其欧拉回路或欧拉路。 二、问题分析 本实验的最终目的是要求取欧拉图的欧拉回路或欧拉半图的欧拉路,那么在这之前我们需要完成的是邻接矩阵的生成,图的连通性判别,如若连通,再判断其是否为欧拉图或欧拉半图,最终求取欧拉回路或欧拉路。 1.生成随机矩阵 定义数组二维数组l[][],用以存储邻接矩阵的信息。再定义结点数目n,从键盘键入之。根据n的大小,在嵌套的for循环中,每次循环都利用rand函数随机生成某数并对2取余,将结果赋值给l[i][j]。当然在for循环之前需要调用srand函数取计算机当前时间作为种子,防止rand函数生成伪随机数。 2.判断连通性 考虑到在上述步骤中已经有图的邻接矩阵生成,可以考虑用可达性矩阵来判断图的连通性。 这样,问题的关键就变成了求取可达性矩阵的问题。 为了不影响原邻接矩阵信息,定义新二维数组p[][]复制邻接矩阵数据来进行运算操作,并定义二维数组s[][],初始化为全0,用来存储最终可达性矩阵。 具体操作应为:首先将利用for循环将p与l相乘,结果存于p中;而后将p加上s,结果存于s中。再将以上步骤整体置于一个循环n次的for循环下。执行完之后,检查s[][],将非零值都修正为1,这样我们可以得到可达性矩阵s[][]。 最后,遍历检查s[][]中每个元素的值,如果发现有元素值为0,那么该图不具有连通性;否则,该图具有连通性,可以进行下面步骤的判断。 3.判断是否为欧拉图或欧拉半图 定义数组deg[],用来存储每个结点的度。依行检查l[][],将第i行的值相加可得deg[i]。再依据deg[]来判断该图是否为欧拉图或欧拉半图:如果每个结点的度均为偶数,该图为欧拉图;如果奇数度结点个数为2,该图为欧拉半图;否则,两者均不是。 4.欧拉路或欧拉回路的求取 对于欧拉路或欧拉回路的求取,我们依旧利用邻接矩阵来求。 (1)求取欧拉回路时,我们可以任意选择起点开始。按行搜索邻接矩阵,若果检查第i行时发现l[i][j]非0,将其修正为0后,输出i-j,搜索第j行,如此循环,可得欧拉回路。 当然在此之前我们需要求得每个结点的度数之和sum,来控制上述循环次数不超过sum/2,使得循环可以适时结束。 (2)在求取欧拉路时,只要控制循环起点为奇数度结点即可。其他步骤与上述求取欧拉回路步骤一致。 三、具体程序实现 #include iostream #include cstdlib #include ctime using namespace std; int main() { int n,l[20][20],p[20][20],s[20][20]; int deg[20];//用于存储每个结点的度数 int count1=0;//用于存储奇数度结点个数 int start=0; srand((int)time(0)); cout请输入结点个数:; cinn; for(int i=0;in;i++) { for(int j=i;jn;j++) { if(i==j) l[i][j]=0; else { l[i][j]=rand()%2; l[j][i]=l[i][j]; } } } cout随机生成领接矩阵:endl; for(i=0;in;i++) { deg[i]=0; for(int j=0;jn;j++) { coutl[i][j] ; } coutendl; } //通过可达性矩阵判断连通性 for(i=0;in;i++) { for(int j=0;jn;j++) { p[i][j]=l[i][j]; s[i][j]=0; } } for(int y=0;yn;y++) { for(i=0;in;i++) { for(int j=0;jn;j++) { s[i][j]+=p[i][j]; } } for(i=0;in;i++) { for(int j=0;jn;j++) { for(int k=0;kn;k++) { p[i][j]+=p[i][k]*l[k][j]; } } } } for(i=0;in;i++) { for(int j=0;jn;j++) { if(s[i][j]!=0) { s[i][j]=1; } } } cout可达性矩阵为:endl; fo

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档