离散数学实践试验报告--格式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《离散数学应用实践》
实验报告
课序号: 03
学号:
姓名:
任课教师:陈瑜
评阅成绩:
评阅意见:
提交报告时间:2014年 1 月 3 日
判断图的强连通,单连通,弱连通,判断树,
求强分图
(一)问题描述
(二)算法分析
(三)程序源代码
(四)测试数据与运行结果
(五)算法复杂性分析与讨论
(一)问题描述
编写一个程序,从控制台输入一个用邻接矩阵表示的图,程序实现判断该图的强连通性,弱连通性,单连通性,判断该图是否为树,求强分图等操作,并从控制台输出判断结果。
(二)算法分析
程序流程图:
1.判断图的强连通性
运用warshall算法先求其可达矩阵,判断可达矩阵元素是否全为一,全为一则具有强连通性;否则不具有。
2.判断图的单连通性
运用warshall算法先求其可达矩阵,判断可达矩阵元素与其对角元素是否全为零,全为零则不具有单连通性;否则具有。
3.判断图的弱连通性
先求其基图,若可达矩阵元素与其对角元素有一个为一,则将其都置一,同时将其可达矩阵主对角线元素全置一,从而得到其基图。然后再运用warshall算法求其可达矩阵,判断其强连通性,若其基图具有强连通性,则此图具有弱连通性;否则不具有。
4.判断图是否为树
此部分是对于无向图进行判断,先判断此图的强连通性,若不具有强连通性,则不是树;若具有强连通性,再统计其节点总度数,求其边数,如果边数等于顶点数减一,则为树,否则不为树。
5.求图的强分图
同样,先运用warshall算法先求其可达矩阵,然后对其可达矩阵求其转置,与其转置中的对应元素进行“&&”处理,并置主对角元素为一,得到其强分图矩阵。
下面是求强分图的伪码:
While(i { Flag=ture; //判断强分图标记 While(flag) { J=i+l; //扩大强分图范围 判断以i为为强分图新矩阵的左上顶点,逐步扩大强分图矩阵,如果其强分图矩阵全为一,flag置一,否则置零。 } 输出强分图; I=j; } (三)程序源代码 #include using namespace std; class map { int **m; int num; public: map(); void Setmap(int n); //设置邻接矩阵 void change1(); //求可达矩阵 void change2(); //求强分图矩阵 bool IsStrongConnectivity(); //判断强连通性 bool IsSingleConnectivity(); //判断单连通性 bool IsWeakConnectivity(); //判断弱连通性 void Stronggraph(); //求强分图 bool IsTree(); //判断是否为树void show(); //显示矩阵}; map::map() { num=0; m=NULL; } void map::Setmap(int n) //设置矩阵{ num=n; m=new int *[num]; cout<<" "; for(int h=0;h { m[h]=new int [num]; cout<<" v"< } cout< int k; for(int i=0;i { cout<<"v"< for(int j=0;j { cin>>k; m[i][j]=k; } } } void map::change1() //求可达矩阵,运用Warshall 算法 { int i,j,k; for(i=0;i { for(j=0;j { if(m[j][i]==1) { for(k=0;k { m[j][k]=m[j][k]||m[i][k]; } } } } } void map::change2() //求强分图矩阵 { int i,j; int **m1; m1=new int *[num]; for(i=0;i { m1[i]=new int [num]; } for(i=0;i for(j=0;j { m1[i][j]=m[j][i]; } } for(i=0;i { for(j=0;j { m[i][j]=m[i][j]&&m1[i][j]; } m[i][i]=1; //主对角线置1 } } bool map::IsTree() //判断树 { int sum=0; for(int i=0;i { for(int j=0;j