南邮|离散数学实验四(图的生成及欧拉(回)路的确定)

这篇具有很好参考价值的文章主要介绍了南邮|离散数学实验四(图的生成及欧拉(回)路的确定)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内容:随机生成含指定节点数量n的无向连通图,并确定其中有无欧拉()路,若有则需要获取至少一条路径并输出。

要求:能随机生成无向连通图并正确判断其是否为()欧拉图,若是欧拉图,则还需输出至少一条欧拉()路。

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <string>
#include <cstring>
using namespace std;

int N;		//随机数N
int **M;	//关联矩阵
int LTFlag; //连通标志
int OLLFlag;//欧拉路标志
int OLHLFlag;//欧拉回路标志

//正整数转字符串 
string IntegerToString(int integer) {
	if(integer==0) return "0";
	int count=0;
	int temp=integer;
	while(temp) {
		count++;
		temp/=10;
	}
	string s = "";
	temp=integer;
	for(int i=0; i<count; i++) {
		s=s+(char)(temp%10+'0');
		temp/=10;
	}
	reverse(s.begin(),s.end());
	return s;
}

//输出关联矩阵
void ToString() {
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			cout << M[i][j] << " ";
		}
		cout << endl;
	}
}

//生成随机矩阵
void RandM() {
	srand((unsigned)time(NULL));
	for(int i=0; i<N; i++) {
		for(int j=i; j<N; j++) {
			if(i==j) {
				M[i][j]=0;
				continue;
			}
			int k = rand()%100;
			if(k>50) {
				M[i][j]=1;
				M[j][i]=1;
			} else {
				M[i][j]=0;
				M[j][i]=0;
			}
		}
	}
}

//判断是否连通 (War Shall)
void  LianTong() {
	int temp[N][N];
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			temp[i][j]=M[i][j];
		}
	}
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			if(temp[j][i]==1) {
				for(int k=0; k<N; k++) {
					temp[j][k]=temp[j][k] || temp[i][k];
				}
			}
		}
	}
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			if(temp[i][j]==0) return;
		}
	}
	LTFlag=1;
}

//判断欧拉路
void OuLaLu() {
	int count=0;
	for(int i=0; i<N; i++) {
		int du=0;
		for(int j=0; j<N; j++) {
			if(M[i][j]==1) {
				du++;
			}
			if(M[i][j]==1&&i==j) {
				du++;
			}
		}
		if(du%2!=0) {
			count++;
		}
	}
	if(count==0 || count ==2) {
		OLLFlag=1;
	}
}

//判断欧拉回路
void OuLaHuiLu() {
	int count=0;
	for(int i=0; i<N; i++) {
		int du=0;
		for(int j=0; j<N; j++) {
			if(M[i][j]==1) {
				du++;
			}
			if(M[i][j]==1&&i==j) {
				du++;
			}
		}
		if(du%2==1) {
			return;
		}
	}
	OLHLFlag=1;
}

//输出欧拉路
void PrintOuLaLu(int k,int **v,int start,string s) {
	int flag=1;
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			if(v[i][j]==1) {
				flag=0;
				break;
			}
		}
		if(!flag) {
			break;
		}
	}
	if(flag) {
		cout << s << endl;
		return ;
	}
	for(int i=0; i<N; i++) {
		if(M[k][i]==1&&v[k][i]==1) {
			v[k][i]=v[i][k]=0;
			string temp=s;
			s=s+"->";
			s=s+(char)(i+'0');
			PrintOuLaLu(i,v,start,s);
			v[k][i]=v[i][k]=1;
			s=temp;
		}
	}
}

//输出欧拉回路
void PrintOuLaHuiLu(int k,int **v,int start,string s) {
	int flag=1;
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			if(v[i][j]==1) {
				flag=0;
				break;
			}
		}
		if(!flag) {
			break;
		}
	}
	if(flag) {
		if(start==k) {
			cout << s << endl;
		}
		return ;
	}
	for(int i=0; i<N; i++) {
		if(M[k][i]==1&&v[k][i]==1) {
			v[k][i]=v[i][k]=0;
			string temp=s;
			s=s+"->";
			s=s+(char)(i+'0');
			PrintOuLaHuiLu(i,v,start,s);
			v[k][i]=v[i][k]=1;
			s=temp;
		}
	}
}

void Input() {
	cin >> N;
	M = new int *[N];
	for(int i=0; i<N; i++) {
		M[i] = new int[N];
	}
}

void Output() {
	do {
		RandM();
		LianTong();
	} while(!LTFlag);
	cout << "关联矩阵" << endl;
	ToString();
	OuLaLu();
	cout <<(OLLFlag?"是":"不是") <<"半欧拉图" << endl;
	if(OLLFlag) {
		int **v=M;
		for(int i=0; i<N; i++) {
			PrintOuLaLu(i,v,i,IntegerToString(i));
		}
	}
	OuLaHuiLu();
	cout <<(OLHLFlag?"是":"不是")<< "欧拉图" << endl;
	if(OLHLFlag)  {
		int **v=M;
		for(int i=0; i<N; i++) {
			PrintOuLaHuiLu(i,v,i,IntegerToString(i));
		}
	}
}
int main() {
	Input();
	Output();
	return 0;
}

 南邮离散数学实验,离散数学,算法,图论,c++

 南邮离散数学实验,离散数学,算法,图论,c++

 南邮离散数学实验,离散数学,算法,图论,c++文章来源地址https://www.toymoban.com/news/detail-821683.html

到了这里,关于南邮|离散数学实验四(图的生成及欧拉(回)路的确定)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 离散数学-图论-图的基本概念(11)

    1.1 图的定义 定义1: 一个 无向图 G是一个有序的二元组V,E,其中 (1)V是一个非空有穷集,称为顶点集,其元素称为顶点或结点。 (2)E是无序积VV的有穷多重子集,称为边集,其元素称为无向边,简称边。 定义2: 一个 有向图 D是一个有序的二元组V,E,其中 (1)V是一个非

    2024年02月13日
    浏览(49)
  • 离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

    本文主要解决以下几个问题: 1.欧拉图能不能有割点,能不能有桥? 2.哈密顿图能不能有割点,能不能有桥? 首先我们要明白几个定义 割点 的定义就是在一个图G中,它本来是连通的,去掉一个点v以后这个图G就不连通了,那么点v就被叫做 割点 。 桥 的定义就是在一个图G中

    2024年02月08日
    浏览(38)
  • 离散数学·图的矩阵表示、平面图

    无环 , 有向 (可以表示平行边) M(D)【direction】 每一列的和都是0,每一行中所有元素的绝对值是点的度数 所有列相加一定是0(每一列都是0) 第i行第j列是1的情况的和是出度数 同1 平行边的表示就是再加一条一样的列 无向 , 无环 M( G ) 看一下(3)吧🎱🎱🎱 简而言之—

    2024年02月01日
    浏览(43)
  • 离散数学·通路与回路、图的连通性、连通度

    通路 —— 点边点边……点(点边可以重复) 注意 长度 的概念 ——边数 回路 —— 最后又回到自己,如其字面意思 简单 —— 边互异(边不可重复) 初级 —— 点互异(点不可重复,除了起点终点) 注意 路径 和 圈 所指代的 复杂通路 应该不是很重要,先不看 注意是在 无

    2024年02月03日
    浏览(74)
  • 离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

    同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法 1.重数:两点之间的平行边的个数   1.得到 n! 的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最

    2024年01月25日
    浏览(42)
  • 离散数学实验一

    实验题目:可简单图化、连通图、欧拉图和哈密顿图的判断 实验目的: 掌握可简单图化的定义及判断方法; 掌握连通图、欧拉图的判断方法; 掌握欧拉回路的搜索方法; 了解欧拉图的实际应用。 实验要求: 给定一非负整数序列(例如:(4,2,2,2,2))。 判断此非负整数序列是

    2024年02月05日
    浏览(209)
  • 《离散数学》实验报告HEBUT

    《离散数学》是现代数学的一个重要分支,是计算机科学与技术专业的基础理论课,也是该专业的核心课程和主干课程。“离散数学”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。该课程一方面为后继课程如数据结构、编绎原理、操作

    2024年02月09日
    浏览(65)
  • 离散数学实验三 · 最短路径计算

    一、实验目的 通过本实验的学习理解Dijkstra算法,并且编码实现最短路径问题。 二、实验内容 Dijkstra算法的理解; 算法概念:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,之后每求得一条最

    2024年02月03日
    浏览(36)
  • 离散数学实验----中国邮递员问题

    实验目的和要求 实验目的: 理解什么是欧拉图,熟悉欧拉路和欧拉回路的概念。 掌握Dijkstra算法,求解最短路径 掌握Fleury算法,求解欧拉回路。 了解Edmonds-Johnson算法解决中国邮递员问题的基本思路。 通过程序实现中国邮递员问题,强化其基本思想和实际应用。 实验要求:

    2023年04月12日
    浏览(38)
  • NEFU离散数学实验2-容斥原理

    相关概念  离散数学中的容斥原理是一种使用集合运算的技巧,通常用于计算两个或更多集合的并集或交集的大小。以下是一些与容斥原理相关的常见概念和公式。 概念: 1. 集合:由元素组成的对象,通常用大写字母表示,如A、B、C等。 2. 元素:集合中的单个对象,通常用

    2024年02月07日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包