【王道数据结构】【chapter6图】【P234t3】

试设计一个算法,判断一个无向图G是否为一棵树,如果是一棵树,则算法返回true,否则返回false(思路看书,不同于书的是我们这里采用bfs)

#include <iostream>
#include <stdio.h>
#include <queue>
#define maxsize 10typedef struct node{int data;struct node* next;
}node,*pnode;pnode buynode(int x)
{pnode tmp=(pnode) malloc(sizeof (node));tmp->data=x,tmp->next= nullptr;return tmp;
}
pnode * graph(int point)
{pnode *a=(pnode*) malloc(sizeof (pnode)*point);for(int i=0;i<point;i++)a[i]= buynode(i);return a;
}void figure1(pnode* g)
{g[0]->next= buynode(1);g[0]->next->next= buynode(2);g[0]->next->next->next= buynode(3);g[1]->next= buynode(0);g[2]->next= buynode(0);g[3]->next= buynode(0);
}void print(pnode* p,int point)
{printf("the figure is:\n");for(int i=0;i< point;i++){pnode tmp=p[i];while(tmp){printf("%3d",tmp->data);tmp=tmp->next;}puts("");}
}
void figure2(pnode* g)
{for(int i=0;i<4;i++){pnode tmp=g[i];for(int j=0;j<4;j++){if (i!=j){tmp->next = buynode(j);tmp = tmp->next;}}}
}void figure3(pnode* g)
{g[0]->next= buynode(1);g[0]->next->next= buynode(2);g[1]->next= buynode(0);g[1]->next->next= buynode(3);g[1]->next->next->next= buynode(4);g[2]->next= buynode(0);g[3]->next= buynode(2);g[4]->next= buynode(2);}void figure4(pnode* g)
{g[0]->next= buynode(1);g[0]->next->next= buynode(2);g[1]->next= buynode(0);g[1]->next->next= buynode(3);g[1]->next->next->next= buynode(4);g[2]->next= buynode(0);g[3]->next= buynode(2);g[3]->next->next= buynode(4);g[4]->next= buynode(2);g[4]->next->next= buynode(3);}bool is_tree(pnode* g)
{int point=0,side=0;std::queue<pnode> record;record.push(g[0]);int* visited=(int *) malloc(sizeof (int)*maxsize);for (int i = 0; i < maxsize; ++i)visited[i] = 0;printf("the visit order:");visited[0]=1;while(!record.empty()){pnode head=record.front();point++;record.pop();printf("%3d",head->data);while(head->next) {side++;if(!visited[head->next->data]) {//没有访问过record.push(g[head->next->data]);visited[head->next->data]=1;//被访问过了}head = head->next;}}puts("");printf("point:%3d,side:%3d\n",point,side);return point==((side/2)+1);
}
int main() {pnode* g1= graph(4);figure1(g1);print(g1,4);if(is_tree(g1)) printf("g1 is a tree\n");else printf("g1 is just a graph\n");puts("");pnode* g2= graph(4);figure2(g2);print(g2,4);if(is_tree(g2)) printf("g2 is a tree\n");else printf("g2 is just a graph\n");puts("");pnode* g3= graph(5);figure3(g3);print(g3,5);if(is_tree(g3)) printf("g3 is a tree\n");else printf("g3 is just a graph\n");puts("");pnode* g4= graph(5);figure4(g4);print(g4,5);if(is_tree(g4)) printf("g4 is a tree\n");else printf("g4 is just a graph\n");return 0;
}

对于上面的代码我们用了四张图进行测试,这四张图分别如下:

其中只有1和3是树,2和4不是。

在我们的程序中,我们打印了邻接表和遍历顺序来方便我们观察:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ArcGIS Pro SDK的MVVM架构

示例结果展示 文件夹创建 相对于原始C#&#xff0c;少了Command文件夹里的类。该文件中的RelayCommand使用 ArcGIS.Desktop.Framework Properties属性配置&#xff0c;主要用于设置执行程序路径&#xff08;自带文件夹&#xff09; DarkImages用于存放深色图片&#xff08;自…

docker pullpush 生成镜像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的镜像仓库 docker run -it ultralytics/ultralytics # 运行镜像 conda create -n gsafety python3.8 # 创建环境 source activate gsafety # 激活环境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

安卓开发:挑战每天发布一个封装类02--Wav录音封装类AudioChannel 1.0

简介 库名称&#xff1a;AudioChannel 版本:1.0 由于项目需求录音并base64编码存到服务器中&#xff0c;就顺手改装了一个别人的封装类 原封装类地址:Android AudioRecord音频录制wav文件输出 - 简书 (jianshu.com) 描述&#xff1a;此封装类基于AudioRecord实现wav的音频…

Cesium 问题:加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

Aster实现一台电脑当两台使——副屏搭配键鼠

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

实战打靶集锦-025-HackInOS

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 提权5.1 枚举系统信息5.2 探索一下passwd5.3 枚举可执行文件5.4 查看capabilities位5.5 目录探索5.6 枚举定时任务5.7 Linpeas提权 靶机地址&#xff1a;https://download.vulnhub.com/hackinos/HackInOS.ova 1. 主机…

《穿越科技的前沿:计算机专业必看的电影盛宴》

文章目录 每日一句正能量前言电影推荐推荐一&#xff1a;《黑客帝国》推荐二&#xff1a;《社交网络》推荐三&#xff1a;《源代码》推荐四&#xff1a;《谍影重重》系列推荐五&#xff1a;《旋转木马》 技术与主题后记 每日一句正能量 一个人的一生&#xff0c;就是一座有了年…

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器&#xff0c;有以下三种工作模式。 1&#xff09;独立的Servlet容器&#xff0c;由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行&#xff0c;Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…

『防骗指南』OpenAI官方提供的Sora体验资格申请渠道只有这两个!附内测申请链接!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

回显服务器的制作方法

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中&#xff0c;主动发起通信的一方是客户端&#xff0c;被动接受的这一方…

【快速上手QT】04-定时器Timer

先来个小示例 我们先简单的来触发一下定时器。 #include "Zhetu.h"#include <qdebug.h>void Zhetu::timerEvent(QTimerEvent* event) { //定时器触发函数qDebug() << "Hello world"; }Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){t…

Py之pydantic:pydantic的简介、安装、使用方法之详细攻略

Py之pydantic&#xff1a;pydantic的简介、安装、使用方法之详细攻略 目录 pydantic的简介 1、Pydantic V1.10 vs. V2 pydantic的安装 pydantic的使用方法 1、简单的示例 pydantic的简介 pydantic是使用Python类型提示进行数据验证。快速且可扩展&#xff0c;Pydantic与您…