【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求

实验要求

变量定义

因为如果我们使用局部变量,每一个函数都会使用这些变量,会让函数的参数越变越多。所以我们定义全局变量,这样就不用在参数中调用了。

#define MAX  100
int arrMap[MAX][MAX] = { 0 };//图的矩阵
int degree[MAX] = { 0 };//节点的度
int visit[MAX] = { 0 };//记录是否被访问
int euler[MAX] = { -1 };
int ans[MAX];     //欧拉路
int c[MAX][MAX];    //判断该边是否已经走过
int m = 0;//结点个数
int n = 0;//边数

根据边来生成图函数

在这里插入图片描述

//随机生成边
void creatSide()
{
	int count = 0;
	while (count < n)
	{
		int x = rand() % m;
		int y = rand() % m;
		while (x == y)
			x = rand() % m;
		if (!arrMap[x][y])
		{
			arrMap[x][y] = arrMap[y][x] = 1;
			count++;
			degree[x]++;
			degree[y]++;
		}
	}

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			printf("%d ", arrMap[i][j]);
		}
		printf("\n");
	}
}

判断联通函数

DFS通过递归的方式,从给定的起始顶点开始,沿着一条路径一直走到底,然后回退到上一个节点,再选择另一条路径继续走下去。当所有路径都被探索完毕时,如果所有的节点都被访问到,则图是连通的

//深度优先搜索判断是否为连通图
void DFS(int x)
{
	visit[x] = 1;
	for (int i = 0; i < m; i++)
	{
		if (!visit[i] && arrMap[x][i])
		{
			DFS(i);
		}
	}
}
//判断联通是返回1不是返回0
int judgeConnect()
{
	DFS(0);
	for (int i = 0; i < m; i++)
	{
		if (!visit[i])
		{
			return 0;
		}
	}
	return 1;
}

判断是否有欧拉路

有0个或2个奇数度结点的有欧拉路。

//判断是否是(半)欧拉图
void judgeEuler()
{
	int first = 0;
	int num = 0;//奇数结点个数
	for (int i = 0; i < m; i++)
	{
		if (degree[i] % 2 != 0)
		{
			first = i;
			num++;
		}
	}

	if (num == 1 || num > 2)
	{
		printf("不是欧拉图或半欧拉图\n");
	}
	else
	{
		euler[0]= first;
		trav(first, 1);
		if (num == 0)
		{
			printf("随机生成的图是欧拉图\n");
			printf("该欧拉图的一条欧拉路是\n");
		}
		else
		{
			printf("随机生成的图是半欧拉图\n");
			printf("该半欧拉图的一条欧拉路是\n");
		}
		for (int i = 0; i < n; i++)
		{
			printf("%d->", ans[i]);
		}
		printf("%d\n", ans[n]);
	}
}

生成欧拉路

如果图满足所有顶点的度数都是偶数,可以从任意顶点开始,任意顺序遍历边,直到回到起始顶点,这样就能生成一条欧拉路。
如果图中仅有两个顶点的度数为奇数,首先找到这两个奇数度顶点,然后从其中一个奇数度顶点开始,遍历所有边直到另一个奇数度顶点,这样也能生成一条欧拉路。

//找欧拉路
void trav(int p, int q)
{
	int flag = 1;
	if (euler[n] != -1)
	{
		if(flag == 1)
		{
			for (int i = 0; i <= n; i++)
			{
				ans[i] = euler[i];
			}
			flag = 0;
		}

	}
	for (int i = 0; i < m; i++)
	{
		if (arrMap[p][i] && !c[p][i])
		{
			euler[q] = i;
			c[p][i] = c[i][p] = 1;
			trav(i, q + 1);
			if (!flag)return;
			else c[p][i] = c[i][p] = 0;

		}
	}
}

源码

# define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define MAX  100
int arrMap[MAX][MAX] = { 0 };//图的矩阵
int degree[MAX] = { 0 };//节点的度
int visit[MAX] = { 0 };//记录是否被访问
int euler[MAX] = { -1 };
int ans[MAX];     //欧拉路
int c[MAX][MAX];    //判断该边是否已经走过
int m = 0;//结点个数
int n = 0;//边数
//随机生成边
void creatSide()
{
	int count = 0;
	while (count < n)
	{
		int x = rand() % m;
		int y = rand() % m;
		while (x == y)
			x = rand() % m;
		if (!arrMap[x][y])
		{
			arrMap[x][y] = arrMap[y][x] = 1;
			count++;
			degree[x]++;
			degree[y]++;
		}
	}

	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < m; j++)
		{
			printf("%d ", arrMap[i][j]);
		}
		printf("\n");
	}
}
//深度优先搜索判断是否为连通图
void DFS(int x)
{
	visit[x] = 1;
	for (int i = 0; i < m; i++)
	{
		if (!visit[i] && arrMap[x][i])
		{
			DFS(i);
		}
	}
}
//判断联通是返回1不是返回0
int judgeConnect()
{
	DFS(0);
	for (int i = 0; i < m; i++)
	{
		if (!visit[i])
		{
			return 0;
		}
	}
	return 1;
}
//找欧拉路
void trav(int p, int q)
{
	int flag = 1;
	if (euler[n] != -1)
	{
		if(flag == 1)
		{
			for (int i = 0; i <= n; i++)
			{
				ans[i] = euler[i];
			}
			flag = 0;
		}

	}
	for (int i = 0; i < m; i++)
	{
		if (arrMap[p][i] && !c[p][i])
		{
			euler[q] = i;
			c[p][i] = c[i][p] = 1;
			trav(i, q + 1);
			if (!flag)return;
			else c[p][i] = c[i][p] = 0;

		}
	}
}
//判断是否是(半)欧拉图
void judgeEuler()
{
	int first = 0;
	int num = 0;//奇数结点个数
	for (int i = 0; i < m; i++)
	{
		if (degree[i] % 2 != 0)
		{
			first = i;
			num++;
		}
	}

	if (num == 1 || num > 2)
	{
		printf("不是欧拉图或半欧拉图\n");
	}
	else
	{
		euler[0]= first;
		trav(first, 1);
		if (num == 0)
		{
			printf("随机生成的图是欧拉图\n");
			printf("该欧拉图的一条欧拉路是\n");
		}
		else
		{
			printf("随机生成的图是半欧拉图\n");
			printf("该半欧拉图的一条欧拉路是\n");
		}
		for (int i = 0; i < n; i++)
		{
			printf("%d->", ans[i]);
		}
		printf("%d\n", ans[n]);
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	
	printf("请输入结点个数:");
	scanf("%d", &m);

	printf("请输入边数,需小于等于%d:", m * (m - 1) / 2);
	scanf("%d", &n);

	
 back:
	creatSide();
	int ret = judgeConnect();
	if (ret == 0)
	{
		printf("该图不是连通图,结点度为\n");
		for (int i = 0; i < m; i++)
		{
			printf("%d ", degree[i]);
		}
		printf("\n");
		goto back;
	}
	else 
	{
		judgeEuler();
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/737381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEO数据挖掘-富集分析、TinyArray简化流程、多组样本分析more

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 富集分析一些理论知识具体代码 富集不到的补救措施更多资料---问题数据和常见错误分析Part4-复杂数据及其分析多分组数据分析流程 tinyarray简化版本分析流程多分组…

ROS机器人虚拟仿真挑战赛持续学习笔记-20240619

cartographer 需要全手工编译……比较麻烦。 如果使用新版ceres-solver&#xff0c;版本2.x&#xff0c;需要修改源码&#xff0c;部分“接口代码”有改动。 稳妥使用ceres-solver-1.13.0&#xff0c;且需要安装abseil-cpp。 验证是否成功&#xff0c;使用roscd或roslaunch…

C语言| 数组元素的删除

同数组元素的插入差不多。 数组元素的插入&#xff0c;是先移动要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;长度1。 C语言| 数组的插入-CSDN博客 数组元素的删除&#xff0c;是先删除元素&#xff0c;再把后面的元素往前移动一位&#xff0c;而本程序…

三国之家网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;公告管理&#xff0c;三国视频管理&#xff0c;基础数据管理&#xff0c;三国图文管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#…

2.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这篇文章介绍arduino使用和安装arduino_bridge 将arduino与树莓派连接 查看arduino的端口号&#xff0c;我们这里查看到的时ttyUSB0 ll /dev/ttyUSB*将当前用户添加进dialout组 sudo usermod -a -G dialout your_user_name然后重启树莓派&#xff0c;然后才能生效 然后如果你…

“Driver not loaded“问题解决方案

这两天又碰到了离谱的&#xff0c;愚蠢的&#xff0c;莫名其妙的&#xff0c;丧尽天良的错误。 之前已经解决过这个问题。这几天又碰上了&#xff0c;明明都已经把相应的dll放到了exe的同级目录&#xff0c;NND还是有问题&#xff01;&#xff01;&#xff01;卡了我一个晚上加…

Linux C/C++ socket函数

目录 socket函数 函数原型 头文件 功能 返回值 参数 错误码 socket函数 函数原型 int socket(int domain, int type, int protocol); 头文件 #include <sys/types.h> #include <sys/socket.h> 功能 创建一个用于通信的端点&#xff0c;并返回一个文件描述符…

tensorRT C++使用pt转engine模型进行推理

目录 1. 前言2. 模型转换3. 修改Binding4. 修改后处理 1. 前言 本文不讲tensorRT的推理流程&#xff0c;因为这种文章很多&#xff0c;这里着重讲从标准yolov5的tensort推理代码&#xff08;模型转pt->wts->engine&#xff09;改造成TPH-yolov5&#xff08;pt->onnx-…

Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置

文章目录 PreLinux 的 /proc/sys/vm 简述什么是 /proc/sys/vm&#xff1f;主要的配置文件及其用途参数调整对系统的影响dirty_background_ratio 和 dirty_ratioswappinessovercommit_memory 和 overcommit_ratiomin_free_kbytes 实例与使用建议调整 swappiness设置 min_free_kb…

6.XSS-钓鱼攻击展示(存储型xss)

xss钓鱼演示 钓鱼攻击利用页面 D:\phpStudy\WWW\pikachu\pkxss\xfish 修改配置文件里面对应自己的入侵者的IP地址或者域名&#xff0c;对应的路径下的fish.php脚本如下&#xff1a; <?php error_reporting(0); // var_dump($_SERVER); if ((!isset($_SERVER[PHP_AUTH_USE…

分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测&…

嵌入式学习——数据结构(队列)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2 5. 算法设计 5.1 正确性 5.2 可读性&#xff08;高内聚、低耦合&#xff09; 5.3 健壮性 5.4 高效率&#xff08;时间复杂度&am…

线程封装,互斥

文章目录 线程封装线程互斥加锁、解锁认识接口解决问题理解锁 线程封装 C/C代码混编引起的问题 此处pthread_create函数要求传入参数为void * func(void * )类型,按理来说ThreadRoutine满足,但是 这是在内类完成封装,所以ThreadRoutine函数实际是两个参数,第一个参数Thread* …

Python | Leetcode Python题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:n, m len(dungeon), len(dungeon[0])BIG 10**9dp [[BIG] * (m 1) for _ in range(n 1)]dp[n][m - 1] dp[n - 1][m] 1for i in range(n - 1, -1, …

Redis的实战常用一、验证码登录(解决session共享问题)(思路、意识)

一、基于session实现登录功能 第一步&#xff1a;发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff1a; 如果不合法&#xff0c;则要求用户重新输入手机号如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行…

C语言 | Leetcode C语言题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; #define MAXSIZE 769/* 选取一个质数即可 */ typedef struct Node {char string[101];int index;struct Node *next; //保存链表表头 } List;typedef struct {List *hashHead[MAXSIZE];//定义哈希数组的大小 } MyHashMap;List * …

【百问大模型02】一文讲透RAG实战全解析

1.实时性无法更新&#xff0c;知识容易自相矛盾 2.大模型的缺点有哪些&#xff1f; 3.一个人的能力可以分为两种&#xff1a; 1&#xff09;大模型&#xff1a;推理能力&#xff0c;聪明&#xff0c;知识&#xff1b;很聪明但是缺少知识 2&#xff09;知识库&#xff1a;辅…

第一个Flask程序

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 一切准备就绪&#xff0c;现在我们开始编写第一个Flask程序&#xff0c;由于是第一个Flask程序&#xff0c;当然要从最简单的“Hello World&#xff…

打印机状态显示错误是什么原因?这5个有效方法要记好!

打印机是现代办公中不可或缺的设备之一&#xff0c;但在使用过程中&#xff0c;打印机状态显示错误是一个常见的问题。本文将详细探讨打印机状态显示错误的原因及其解决方法。 摘要 打印机状态显示错误的原因及解决方法如下&#xff1a; 1、网络连接问题&#xff1a;原因&…

【python】python基于微博互动数据的用户类型预测(随机森林与支持向量机的比较分析)(源码+数据集+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…