离散数学实验报告
离散数学 实验报告

离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。
本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。
一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。
图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。
以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。
通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。
二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。
通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。
例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。
三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。
排列组合是密码学中常用的数学工具之一。
通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。
例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。
四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。
通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。
例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。
五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。
图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。
例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。
结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。
通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。
希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。
离散实验报告

离散实验报告专业:数学与应用数学班级:091121学号:2009112125姓名:张鼎珩日期:2011.06.23实验内容:实验一真值计算实验二两个集合运算实验三关系闭包计算实验四关系与函数进行试验:实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三实验程序:#include<stdio.h>/*标准输入输出头文件*/#include<stdlib.h>/*该文件包含了的C语言标准库函数的定义*/#include<string.h>/*字符串数组的函数定义的头文件*/#include<conio.h>/*通用输入输出库*/#include<math.h>#define N 50void jisuan();void zhenzhibiao();void panduan(int b[N],int f);int tkh (char sz[N], char ccu[N], int icu[N], int h0);int fkh (char sz[N], char ccu[N], int icu[N], int h0);main(){int a1;start:do{printf(" 1.求P、Q的合取、析取、条件和双条件的真值\n 2.求任意一个命题公式的真值表,并根据真值表求主范式\n 3.退出\n");printf("\n选择功能选项:");fflush(stdin);/*清空输入缓冲区,通常是为了确保不影响后面的数据读取*/scanf("%d",&a1);switch(a1)/*switch语句实现选择功能*/{case 1:system("cls");jisuan();break;/*功能A*/case 2:system("cls");fflush(stdin);zhenzhibiao();break;/*功能BC*/case 3:system("exit");exit(0);/*结束整个程序的运行*/default:system("cls");goto start;/*控制流转移到start处*/}}while(1);}void jisuan()/*功能A*/{char p,q,t,ch;int p1,q1;do{start:fflush(stdin);printf("请输入P和Q的真值(T或F):");scanf("%c,%c",&p,&q);if((p=='F'||p=='f'||p=='T'||p=='t')&&(q=='F'||q=='f'||q=='T'||q=='t')){if(p=='F'||p=='f')/*赋值*/p1=0;elsep1=1;if(q=='F'||q=='f')q1=0;elseq1=1;if(p1|q1)/*计算*/t='T';elset='F';printf("P析取Q为:%c\n",t);if(p1&q1)t='T';elset='F';printf("P和取Q为:%c\n",t);if((!p1)|q1)t='T';elset='F';printf("P条件Q为:%c\n",t);if(p1==q1)t='T';elset='F';printf("P双条件Q为:%c\n",t);}else{printf("请按正确格式输入!\n");goto start;};printf("是否继续输入?Y/N");fflush(stdin);ch=getch();system("cls");}while(ch!='n'&&ch!='N');}void zhenzhibiao()/*功能BC*/{int i1,i2,d=1,icu[N],kh=0,jg,j=0,h0;int bj=0,hq[N],h=0,x=0,xq[N];char sz[N],ccu[N],sz0[N];hq[0]=-1;xq[0]=-1;printf("请输入一个合法的命题公式(可含与或非及括号):\n");gets(sz);strcpy(sz0,sz);for(i1=0;i1<strlen(sz);i1++){if(sz[i1]==')' || sz[i1]=='(')kh++;if(sz[i1]>='a' && sz[i1]<='z' || sz[i1]>='A' && sz[i1]<='Z'){for(i2=0;i2<j;i2++) /*判断并储存变量*/if(ccu[i2]==sz[i1])d=0;if(d==1){ccu[j]=sz[i1];j++;}d=1;}}printf("\n该式子中的变量个数为:%d\n",j);h0=j;printf("\n输出真值表如下:\n \n");for(i1=0;i1<h0;i1++)printf(" %c ",ccu[i1]);printf(" ");puts(sz);printf("\n");for(i1=0;i1<j;i1++) /*先将所有的变量赋值为零*/icu[i1]=0;for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;printf(" ------> %d\n",jg);strcpy(sz,sz0);for(i1=0;i1<(int)pow(2,j)-1;i1++){++bj;panduan(icu,0); /*赋值变量*/jg=tkh(sz,ccu,icu,h0);if(jg==0)hq[h++]=bj;elsexq[x++]=bj;strcpy(sz,sz0); /*恢复被修改的数组*/for(i2=0;i2<j;i2++)printf(" %d ",icu[i2]);printf(" ------> %d\n",jg);}if(hq[0]==-1)printf("\n该命题公式不存在主合取范式。
离散实验报告_幂集

一、实验目的1. 理解幂集的概念,掌握幂集的运算规则;2. 掌握幂集在实际问题中的应用;3. 培养逻辑思维能力和编程能力。
二、实验原理幂集是指一个集合中所有子集的集合,记作P(A)。
对于任意集合A,其幂集P(A)的元素个数等于2的A的元素个数次方。
设集合A={a1, a2, ..., an},则其幂集P(A)包含以下元素:1. 空集∅;2. 单元素集合{a1},{a2},...,{an};3. 两个元素组成的集合,如{a1, a2},{a1, a3},...,{an-1, an};4. ...;5. n个元素组成的集合,即A本身。
幂集的运算规则如下:1. 交换律:P(A) = P(B);2. 结合律:(P(A) ∩ P(B)) ∩ P(C) = P(A ∩ B) ∩ P(C);3. 分配律:P(A) ∪ (P(B) ∩ P(C)) = (P(A) ∪ P(B)) ∩ (P(A) ∪ P(C))。
三、实验内容1. 定义一个集合A;2. 求集合A的幂集P(A);3. 分析幂集在实际问题中的应用。
四、实验步骤1. 定义集合A,例如:A = {1, 2, 3};2. 编写程序计算幂集P(A);3. 分析幂集P(A)的元素;4. 应用幂集解决问题。
五、实验结果以集合A = {1, 2, 3}为例,其幂集P(A)为:P(A) = {∅, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}六、实验分析1. 幂集P(A)包含8个元素,即2^3 = 8,符合幂集的定义;2. 幂集P(A)的元素包括空集、单元素集合、两个元素组成的集合以及A本身;3. 幂集在实际问题中具有广泛的应用,例如:在计算机科学中,集合的幂集可以用于描述数据结构、算法设计等;在数学中,幂集可以用于研究集合论、拓扑学等。
七、实验总结通过本次实验,我们掌握了幂集的概念和运算规则,并了解了幂集在实际问题中的应用。
离散数学上机实验报告

离散数学上机实验报告《离散数学》实验报告姓名:学号:班级:实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。
要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
三.实验环境使用Microsoft Visual C++6.0为编程软件,采用称C/C++语言为编程语言实现。
四.实验过程1.算法分析:合取:p,q都为1的时候为1,其他为0析取:p,q都为0的时候为0,其他为1蕴含:p为1,q为0时为0,其他为1等价:p,q同真同假2.程序代码:#include<stdio.h>int main()int P,Q,a,b,c,d,p,q;printf(" P的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++)printf("\t%d",P);}printf("\n Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++)printf("\t%d",Q);}printf("\n 非P的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==0)/*判断非P的值*/ p=1;elseprintf("\t%d",p);}}printf("\n 非Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==1)/*判断非Q的值*/q=0;elseq=1;printf("\t%d",q);}}printf("\n P与Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==0||P==0)/*判断P与Q的值*/elsea=1;printf("\t%d",a);}}printf("\n P或Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(Q==1||P==1)/*判断P或Q的值*/ b=1;elseb=0;printf("\t%d",b);}}printf("\nP蕴含Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==1&&Q==0)/*判断P蕴含Q的值*/ c=0;elsec=1;printf("\t%d",c);}}printf("\nP等价Q的值");for(P=0;P<2;P++){for(Q=0;Q<2;Q++){if(P==Q)/*判断P等价Q的值*/d=1;elsed=0;printf("\t%d",d);}}printf("\n");return 0;3.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
离散数学试验报告

学院理学院学生姓名 xxx学号 xxxxxxxxxxx实验:编程二元关系的传递性判别,二元关系闭包方法一.前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二.数学原理:1.传递关系:对任意的x,y,z∈A,如果<x,y>∈R且<y,z>∈R,那么<x,z>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x ∈A)∧(y∈A)∧(z∈A)∧((<x,y>∈R)∧(<y,z>∈R)→(<x,z>∈R))]=12.自反闭包、对称闭包、传递闭包:设R是定义在A上的二元关系,若存在A 上的关系R′满足:1)R′是自反的(或对称的、或可传递的),2)R⊆ R′,3)对A上任何其它满足1)和2)的关系R〞,都有:R′⊆R〞。
则称R′为R的自反闭包(或对称闭包、或传递闭包),分别记为r(R)、(s(R)和t(R))。
三.实验编程语言:c++四.实验程序源代码:#include<iostream>using namespace std;int cdx(int a[100][100],int n){int b[100][100],i,j;for(i=1;i<=n-1;i++){for(j=1;j<=n;j++){if(a[1][j]==a[i+1][j] && a[1][j]==0)b[i][j]=0;elseb[i][j]=1;}for(j=1;j<=n;j++){if(b[i][j]!=a[1][j])return 0;}}return 1;}void zfbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[i][i]=1;a[j][j]=1;}}}cout<<"自Á?反¤¡ä闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void dcbb(int a[100][100],int n){int i,j;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){a[j][i]=1;}}}cout<<"对?称?闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void cdbb(int a[100][100],int n){int i,j,k;for(j=1;j<=n;j++){for(i=1;i<=n;i++){if(a[i][j]==1){for(k=1;k<=n;k++){a[i][k]=a[i][k]+a[j][k];}}}}cout<<"传ä?递ÌY闭À?包㨹关?系¦Ì矩?阵¨®为a:êo"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(a[i][j]>1){a[i][j]=1;cout<<a[i][j]<<" ";}else{cout<<a[i][j]<<" ";}}cout<<""<<endl;}}void main(){int i,j,n,a[100][100],sel,ins;cout<<"请?输º?入¨?二t元a关?系¦Ì矩?阵¨®维?数ºyn"<<endl;cin>>n;cout<<"请?按ã¡äa[1,1],a[1,2]...a[1,n],a[2,1]...a[n.n]的Ì?顺3序¨©输º?入¨?关?系¦Ì矩?阵¨®的Ì?元a素?值¦Ì(ê¡§0,ê?1)ê?"<<endl;for(i=1;i<=n;i++)for(j=1;j<=n;j++){cin>>a[i][j];}INDEX:cout<<"请?输º?入¨?要©a判D定¡§的Ì?性?质¨º:êo"<<endl;cout<<"1、¡é传ä?递ÌY性?"<<endl;cout<<"2、¡é自Á?反¤¡ä闭À?包㨹"<<endl;cout<<"3、¡é对?称?闭À?包㨹"<<endl;cout<<"4、¡é传ä?递ÌY闭À?包㨹"<<endl;cout<<"5、¡é退ª?出?"<<endl;cin>>sel;if(sel==1){ins=cdx(a,n);if(ins==0)cout<<"该?二t元a关?系¦Ì不?具?有®D传ä?递ÌY性?。
离散数学实验报告

“离散数学”实验报告目录一、实验目的 (3)二、实验内容 (3)三、实验环境 (3)四、实验原理和实现过程(算法描述) (3)1、实验原理........................................................................................................2、实验过程.......................................................................................................五、实验数据及结果分析 (13)六、源程序清单 (24)源代码 (24)七、其他收获及体会 (45)一、实验目的实验一:熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
实验二:掌握关系的概念与性质,基本的关系运算,关系的各种闭包的求法。
理解等价类的概念,掌握等价类的求解方法。
实验三:理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
二、实验内容实验一:1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))实验二:1.求有限集上给定关系的自反、对称和传递闭包。
(有两种求解方法,只做一种为A,两种都做为B)2. 求有限集上等价关系的数目。
(有两种求解方法,只做一种为A,两种都做为B)3. 求解商集,输入集合和等价关系,求相应的商集。
(C)实验三:以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A)。
并计算任意两个结点间的距离(B)。
对不连通的图输出其各个连通支(C)。
三、实验环境C或C++语言编程环境实现。
四、实验原理和实现过程(算法描述)实验一:1.实验原理(1)合取:二元命题联结词。
离散数学实验报告(两篇)

引言:离散数学是一门基础性的数学学科,广泛应用于计算机科学、电子信息等领域。
本文是《离散数学实验报告(二)》,通过对离散数学实验的深入研究和实践,总结了相关的理论知识和应用技巧,希望能够对读者对离散数学有更加深入的理解。
概述:本实验主要涉及离散数学中的集合、关系、图论等基本概念及其应用。
通过对离散数学的实验学习,深入掌握了这些概念和应用,对于在实际问题中的应用和拓展具有重要的意义。
正文内容:一、集合相关概念及应用1.定义:集合是由元素组成的无序的整体。
介绍了集合的基本概念、集合的表示法以及集合的运算。
2.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。
二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。
介绍了关系的基本概念、关系的表示方法及其运算。
2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。
三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。
介绍了图的基本概念、图的表示方法和图的运算。
2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。
四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。
介绍了布尔代数的基本概念、布尔表达式及其化简方法。
2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。
五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。
介绍了递归的基本原理、递归的应用技巧。
2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。
总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。
集合的应用在数据库查询、关系代数等方面起到了重要的作用。
关系的应用在图像处理、社交网络分析等领域有广泛的应用。
中南大学自动化专业离散数学实验报告2

中南大学自动化专业离散数学实验报告2离散数学作为计算机科学与技术专业的基础课程之一,对于培养学生的逻辑思维和抽象思维能力具有重要意义。
本次实验是关于离散数学中的图论部分,通过实际操作和计算来理解和应用图的相关概念和算法。
实验一开始,我们首先学习了图的基本概念和术语,例如顶点、边、路径、回路等。
然后,我们学习了图的表示方法,包括邻接矩阵和邻接表。
通过实际操作,我们发现邻接矩阵适合表示稠密图,而邻接表适合表示稀疏图。
这种不同的表示方法对于图的遍历和搜索算法有着重要的影响。
接下来,我们进行了图的遍历实验。
通过深度优先搜索和广度优先搜索算法,我们可以遍历图中的所有节点,并找到特定节点之间的路径。
深度优先搜索算法通过递归的方式进行,它会首先访问一个节点的所有邻接节点,然后再递归地访问这些邻接节点的邻接节点。
广度优先搜索算法则是通过队列的方式进行,它会首先访问一个节点的所有邻接节点,然后将这些邻接节点按照访问的顺序加入队列中,再逐个出队进行访问。
通过实验,我们发现深度优先搜索算法更适合用于寻找路径,而广度优先搜索算法更适合用于寻找最短路径。
在实验的后半部分,我们学习了最小生成树和最短路径算法。
最小生成树算法用于找到一个连通图的最小生成树,其中包含了连接图中所有节点的最短路径。
我们学习了Prim算法和Kruskal算法,它们分别基于贪心算法和并查集来实现。
通过实验,我们发现Prim算法适合用于稠密图,而Kruskal算法适合用于稀疏图。
最短路径算法用于找到两个节点之间的最短路径,我们学习了Dijkstra算法和Floyd算法。
Dijkstra算法通过贪心策略逐步更新节点之间的最短路径,而Floyd算法则通过动态规划的方式计算所有节点之间的最短路径。
通过实验,我们发现Dijkstra算法适合用于稀疏图,而Floyd算法适合用于稠密图。
总结起来,本次实验让我们深入了解了离散数学中的图论部分,并通过实际操作和计算来应用图的相关概念和算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
离散数学实验报告(实验ABC)专业班级学生姓名学生学号指导老师完成时间目录第一章实验概述 (2)1.1实验目的 (2)1.2实验内容 (2)1.3实验环境 (2)第二章实验原理和实现过程 (3)2.1实验原理 (3)2.1.1建立图的邻接矩阵,判断图是否连通 (3)2.1.2 计算任意两个结点间的距离 (3)2.1.3对不连通的图输出其各个连通支 (4)2.2实验过程(算法描述) (4)2.2.1 程序整体思路 (4)2.2.2具体算法流程 (4)第三章实验数据及结果分析 (6)3.1建立图的邻接矩阵并判断图是否连通的功能测试及结果分析 (6)3.1.1输入无向图的边 (6)3.1.2建立图的连接矩阵 (7)3.2其他功能的功能测试和结果分析 (8)3.2.1计算节点间的距离 (8)3.2.2判断图的连通性 (8)3.2.3输出图的连通支 (9)3.2.4退出系统 (9)第四章实验收获和心得体会 (10)4.1实验收获 (10)4.2心得体会 (11)第五章实验源程序清单 (12)5.1程序代码 (12)第一章实验概述1.1 实验目的理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,培养逻辑思维;通过实验提高学生编写实验报告、总结实验结果的能力,提高理论联系实际的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
1.2 实验内容以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A),并计算任意两个结点间的距离(B),对不连通的图输出其各个连通支(C)。
注意:题目类型分为A,B,C三类,其中A为基本题,完成A类题目可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越高。
基本要求如下:程序需具有基本的容错控制,在输入错误时有处理手段;程序界面友好,需要输入的地方有输入说明,说明输入的内容和格式要求等;实验原理和实现过程应该详细分析问题,给出解决思路,描述算法思想,不能用源程序代替算法;测试数据应全面,包括非法输入的处理结果等都应包含在内。
1.3 实验环境C或C++语言编程环境实现。
第二章实验原理和实现过程2.1 实验原理2.1.1建立图的邻接矩阵,判断图是否连通根据图的矩阵表示法建立邻接矩阵A,并利用矩阵的乘法和加法求出可达矩阵,从而判断图的连通性。
连通图的定义:在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的。
如果 G 是有向图,那么连接vi 和vj的路径中所有的边都必须同向。
如果图中任意两点都是连通的,那么图被称作连通图。
判断连通图的实现:在图中,从任意点出发在剩余的点中,找到所有相邻点循环,直到没有点可以加入为止,如果有剩余的点就是不连通的,否则就是连通的。
或者也可用WallShell算法,由图的邻接矩阵判断图是否连通。
2.1.2 计算任意两个结点间的距离图中两点i,j间的距离通过检验A l中使得a ij为1的最小的l值求出。
路径P中所含边的条数称为路径P的长度。
在图G<V,E>中,从结点Vi到Vj最短路径的长度叫从Vi到Vj的距离,记为d<Vi,Vj>。
设图的邻接矩阵是A,则所对应的aij的值表示,点Vi到点Vj距离为n的路径有aij条。
若aij(1),aij(2),…,aij(n-1),中至少有一个不为0,则可断定Vi与Vj可达,使aij(l)≠0的最小的l即为d(Vi,Vj)。
问题求解原理为:(1)先构造初始邻接矩阵A=Vij,Vij为顶点Vi到顶点Vj的权。
如果Vi 和Vj之间不存在弧段或者是负向回路或者是i=j,则令Vij其值为∞。
(2)再构造初始中间顶点矩阵。
(3)然后开始迭代计算(迭代的次数等于顶点的个数1)(4)最后查找Vi到Vj的最短路径。
计算节点Vi与Vj之间的距离的方法为:利用邻接矩阵相互间相乘后得到的矩阵来判断节点间的距离。
如果c2[s][i][j]==0,则这两个节点的距离为无穷大。
如果c2[s-2][i][j]==0,c2[s-1][i][j]==1时,则这两点间的距离为s。
2.1.3对不连通的图输出其各个连通支图的连通支的求法则可采用图的遍历算法,图的遍历有深度优先和广度优先两种方法,其中深度优先算法又分为递归和非递归两种。
在无向图中,如果任何两点可达,则称图G是连通的,如果G的子图G’是连通的,没有包含G’的更大的子图G’’是连通的,则称G’是G的连通支。
当有判断出关系不是连通的之后,将需要求出分支模块实现方法如下:先定义一个二维数组用来存放相应的分块,先选定一个点,并将它放在数组中,然后判断,如果后面的和他是联通的便将它也放在同一个数组中,否则将其存入其他的数组中,后面以此类推,在输出相应的数组,便可判断出连通分支。
2.2 实验过程(算法描述)2.2.1 程序整体思路本程序完成了实验所要求的全部功能,其基本思路是——“运用模块化的思想,将实现“求连通支”、“输入结点关系”、“输出邻接矩阵”、“显示两结点间的距离”、“求可达矩阵”和“图的遍历”的子函数分开编写,然后将它们以子函数的形式添加到主函数main的代码后面,在要使用相应的子函数时,进行子函数调用就可以实现相应的功能了。
”本程序的一大特色就是开发者灵活使用了C语言中的数组概念来进行开发,用数组来模拟矩阵的运算,通过相应的算法实现了全部的功能。
2.2.2具体算法流程在main(){系统界面显示;用do…while循环语句和switch语句实现功能1,2,3……的选择,并调用相关的子程序;用start、goto start实现控制流的转移;} liantongzhi(){求连通支,此子函数通过一个for循环控制遍历每个结点,并调用函数DFS()求每个结点的连通支;}DFS(int a){通过实参与形参,将结点数据代入函数;定义顺序栈变量;通过for循环初始化;为a置已访问标志,已经访问了的元素为1;定义顺序栈的第一个元素;通过while循环实现结点遍历,栈不为空时执行循环;栈顶元素赋值;通过for循环寻找v的下个未访问的邻接点;通过if条件句,若x,i是边和节点i未被访问过,处理结点的访问,并进行访问标志,进栈等操作;通过if条件句,若v已访问到的出点,则将其退栈;}shuru(){输入结点关系;通过for循环先将矩阵所有元素赋值0;再通过另一for循环,根据输入结点的关系,将矩阵中相应的元素赋值,有关系则为1;} linjiejuzhen(){输出邻接矩阵;通过for循环,依次按格式输出邻接矩阵的元素;} julijuzhen(){根据A的n次方矩阵及其中元素,判断并显示两结点间的距离;调用子函数linjiejuzhen(),以确定并显示距离为1的两结点;通过for循环显示距离为1的结点对;再通过一系列的for循环,计算A的n次方矩阵并显示结果,根据其中的元素,判断并显示结点间的距离;详细算法请见附录相关部分的注释;}kedajuzhen(){求可达矩阵;通过一系列for循环,根据公式,计算可达矩阵;通过for循环,将矩阵中不为0的一切值赋为1以生成可达矩阵并显示;通过for 循环和if条件句的组合,根据可达矩阵的元素特点,判断图的连通性,若可达矩阵矩阵中有0,则跳出循环,显示不可连接;根据判断结果显示内容,不可连通或可连通;}第三章实验数据及结果分析3.1建立图的邻接矩阵并判断图是否连通的功能测试及结果分析简单无向图的输入界面友好,有清楚的操作说明,方便用户进行使用。
这就是集合的输入界面。
3.1.1输入无向图的边当“6,5”时,表示输入的是六个节点五条边的树。
程序会在屏幕上显示输入节点间关系的界面,输入的关系为“1,2;2,3;3,4;4,5;5,6”3.1.2建立图的连接矩阵程序返回主界面后,选择“2”,程序会显示建立的连接矩阵。
3.2 其他功能的功能测试和结果分析3.2.1计算节点间的距离当选择“3”时,程序便会输出各节点间的距离。
3.2.2判断图的连通性当选择“4”时,程序会根据可达矩阵判断图的连通性。
3.2.3输出图的连通支当选择“5”时,程序会输出个连通支。
3.2.4退出系统当选择“6”时,程序会退出系统。
第四章实验收获和心得体会4.1 实验收获这次离散数学实验是基于图论方面知识,以图的各种矩阵为基础,来研究图的一些性质、特点。
我独立完成了本次实验设计,实现了A、B、C三个功能,满足了实验的基本要求,心得如下。
通过这次实验,我学会了用C语言根据图的矩阵表示法建立邻接矩阵A,并利用矩阵的乘法和加法求出可达矩阵,从而判断图的连通性。
巩固了课堂所学的图论方面的有关知识,并在实践中学到:图中两点i,j间的距离可以通过检验A l中使得a ij为1的最小的l值求出;图的连通支的求法可采用图的遍历算法,图的遍历有深度优先和广度优先两种方法,其中深度优先算法又分为递归和非递归两种。
我选择的算法是较为简单、易于实现的深度优先算法最简单,查阅了相关资料,掌握了此算法的核心,最后独立完成了本次实验设计。
这次离散数学实验,从拿到题目到完成整个编程,从理论到实践的日子里,我学到很多东西,不仅可以巩固了以前所学过的知识,而且通过查阅相关资料,学到了很多在书本上所没有学到过的知识。
在这段时间里,我对于离散数学中的“逻辑”有了进一步的理解,对C语言的理解也更进了一步,并提高了编写实验报告、总结实验结果的能力,提高了理论联系实际的能力,初步具备程序设计的思想,能够独立完成简单的算法设计和分析。
感受最深的是,大量的上机实践是成为“编程高手”的必由之路,“质变”需要有“量”的积累。
完成程序的编写,决不意味着万事大吉。
曾经自己认为万无一失的程序,实际上机运行时可能不断出现麻烦,如编译程序检测出一大堆错误。
有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。
开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。
有时候一个小小错误会消耗我好的时间去找,而高手一眼就看出错误所在,这就是熟练程度的不同,量变到质变的不同。
4.2 心得体会这次真的使我意识到了很多原来没有意识到的问题,有时候一些很小的问题,也会令人很是头痛。
在刚开始编写程序的时候,为了实现最基本的输入和输出功能,我却花了大量的时间在那上面。
原因在后来查阅的很多资料后才知道的,像scanf函数之类的小函数,其实是还有很多需要注意的地方的。
之后,在编写数组和指针的过程中,花了很大的一部分时间去研发算法,开发程序,在理论上反复证明没有问题之后,再在计算机上进行操作,编写代码,进行调试,反复了很久,才慢慢的实现了全部的功能,真的是来之不易。