离散数学实验四
内存:1.00GB
软件:
操作系统:Windows XP SP3
编程软件:Visual C++ 6.0
三、实验原理及内容
总体思想:
这次题目要求是根据随机生成的图求欧拉(回)路,先要随机生成一个邻接矩阵,然后判定是否是欧拉回路只要根据奇数度结点的个数。再用一个递归函数找出欧拉路。
核心代码:
1、根据结点数生成邻接矩阵:
通过这次实验,加深了我对图的相关知识的理解,也提高了我动手编程的能力。
五、指导教师评语
成绩
批阅人
日期
count=0;
for(j=0;j<n;j++){
count+=a[i][j];//统计每个结点的度数
}
if(count%2==1)
odd++;//若为奇数,则总数+1
}
if(odd==0)
cout<<"该图没有奇数度结点,具有欧拉回路,是欧拉图。"<<endl;
else if(odd==2)
cout<<"该图有两个奇数度结点,具有欧拉路,是半欧拉图。"<<endl;
else
cout<<"该图奇数度结点的个数为"<<odd<<",所以不具有欧拉路。"<<endl;
3、半欧拉图中找出奇数度结点标号:
flag1=flag2=-1;//分别代表两个奇数度结点的标号
for(i=0;i<n;i++){
count=0;
for(j=0;j<n;j++){
count+=a[i][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j) //同一个结点间没有边
a[i][j]=0;
else if(i>j)//边没有方向性
a[i][j]=a[j][i];
else{//随机赋值,0代表没有边,1代表有边
a[i][j]=rand()%2;
}
}
cout<<" ";//输出该邻接矩阵
for(j=0;j<time;j++){ //表示是否已经存在
if(b[j]==i){
flag=1;break;
}
}
if(!flag){
b[time]=i;
time++;
if(time<exist){ //如果还没走完
find(i,time); //递归
}
else{
return;
}
}
}
}
}
四、运行结果:
}
if(count%2==1){
if(flag1==-1)
flag1=i+1;
else
flag2=i+1;
}
}
4、求欧拉(回)路:
void find(int found,int time){
int i,j,flag;
for(i=0;i<n;i++){
if(a[found][i]==1){
flag=0;
for(i=0;i<n;i++){
cout<<" "<<i+1;
}
cout<<endl;
for(i=0;i<n;i++){
cout<<i+1;
for(j=0;j<n;j++){
cout<<" "<<a[i][j];
}
cout<<endl;
}
2、根据奇数度结点数判定是否含有欧拉(回)路:
odd=0;
for(i=0;i<n;i++){
首先是输入结点数:
然后随机打印出邻接矩阵:
根据性质判断并求出欧拉图:
再试3次:
实验报告
五、实验小结
这次题目要求是根据随机生成的图求欧拉(回)路,首先难点是如何随机生成一个图,这要考虑到3个细节:第1个是同一个结点之间没有边,第2个就是这是无向图,一旦一个结点有了一条边,对应的另一个结点也要有一条边,第3个是要考虑到孤立结点。在此基础上生成了邻接矩阵,欧拉图判断就好弄多了,只要判断奇数度结点的个数。然后再用递归函数找到一条可行路即可。
实验报告
(2014/ 2015学年第一学期)
课程名称
离散数学
实验名称
图的随机生成及欧拉(回)路的确定
实验时间
2014
年
12
月
12
日
指导单位
南京邮电大学
指导教师
罗卫兰
学生姓名
沈一州
班级学号
学院(系)
计算机软件学院
专业
NIIT(软嵌)
实验报告
实验名称
图的随机生成及欧拉(回)路的确定
指导教师
罗卫兰
实验类型
验证型
实验学时
4
实验时间
12.12
一、实验目的和要求
内容:
编程随机生成n个结点的无向图并能进行(半)欧拉图的判定,若是则给出欧拉(回)路。
要求:
对给定n个结点,随机生成邻接矩阵以确定某无向简单图并进行欧拉图和半欧拉图的判定,若符合则给出至少一条欧拉回路或欧拉路。
二、实验环境(实验设