离散数学实践试验报告--格式

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

相关文档
最新文档