《离散数学》实验报告
(2015 / 2016 学年 第 一 学期)
题 目: 图的随机生成及欧拉(回)路的确定
专 业 信息安全 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机学院计算机科学与技术系 日 期 2015年12月29日
图的随机生成及欧拉(回)路的确定
一、 实验内容和要求
内容:编程随机生成n个结点的无向图并能进行(半)欧拉图的判定,若是则给出欧拉(回)路。
要求:对给定n个结点,随机生成邻接矩阵以确定某无向简单图并进行欧拉图和半欧拉图的判定,若符合则给出至少一条欧拉回路或欧拉路。
二、实验目的
对给定n个结点,随机生成邻接矩阵以确定某无向简单图并进行欧拉图和半欧拉图的判定,若符合则给出至少一条欧拉回路或欧拉路。
三、实验任务
1、输入结点个数据生成随机图 2、进行(半)欧拉图的判定 3、若是则给出欧拉(回)路。
四、实验内容
#include
#include
#include
public: Euler(int num); ~Euler();
void DFS(int begin); //公有的深度优先搜索函数 void inputEdge(); //输入边 void PrintAM(); //打印邻接矩阵 void PrintRM(); //打印可达性矩阵 void Warshall(); //Warshall算法求可达性矩阵 bool IsConnected(); / /判断图是否连通 int IsEorSE(); //判断图是欧拉图还是半欧拉图 bool isEuler; private:
void DFS(int u,int v,bool **visited); / /私有的深度优先搜索函数 int n;
int **a; //定义动态二维数组 int **p; //定义可达性矩阵
int *b; //存储每个结点的度数 };
Euler::Euler(int num) //构造函数 { isEuler=false; n=num; int i,j; a=new int*[n]; for(i=0;i Euler::~Euler()//析构函数 { int i; for(i=0;i void Euler::inputEdge() { srand((unsigned)time(NULL)); for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { a[i][j] = 0+rand()%2; a[j][i]=a[i][j]; } //随机生成无向图 } for(int ii=0;ii void Euler::PrintAM() { cout<<\随机生成的图为:\ for(int i=0;i void Euler::Warshall() { for(int i=0;i void Euler::PrintRM() { cout<<\可达性矩阵:\ for(int i=0;i } bool Euler::IsConnected() { int i,j; bool flag=true; / /flag标记是否连通 for(i=0;i if(!flag) cout<<\该图不是连通的\else { for(i=0;i if(a[i][j]==1&&i!=j) //由边计算结点的度数 { b[i]++;b[j]++; } } } return flag; } int Euler::IsEorSE() { int i,count=0,begin=-1; cout<<\每个结点的度数:\ for(i=0;i for(i=0;i } begin=i;//初始化开始结点,存在奇数结点,则将其中一个作为开始点 if(begin==-1)//不存在奇数结点则将0作为起始点 begin=0;
图的随机生成及欧拉(回)路的确定
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)