IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构】图 -> 正文阅读

[数据结构与算法]【数据结构】图

以邻接矩阵作为存储结构存储下面无向图,采用深度优先或广度优先遍历,输出图的所有顶点的值。

在这里插入图片描述

**

程序代码:

**

#include<iostream>
using namespace std;
#define MaxInt 32767
#define MVNum 100
#define OK 1
typedef int Status;
typedef char VerTexType;//顶点数据类型
typedef int ArcType; //边的权值类型
int visited[MVNum];
typedef struct {
	VerTexType vexs[MVNum];//顶点表
	ArcType arcs[MVNum][MVNum];//邻接矩阵
	int vexnum,arcnum;//图的当前点数和边数
} AMGraph;

int LocateVex(AMGraph G,VerTexType u) {
	//存在则返回u在顶点表中的下标;否则返回-1
	int i;
	for(i=0; i<G.vexnum; ++i) {
		if(u==G.vexs[i])
			return i;
	}
	return -1;
}

Status CreateUDN(AMGraph &G) {
	int i,j,k;
	char v1,v2;
	cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
	for(i = 0; i<G.vexnum; ++i)
		cin>>G.vexs[i]; //依次输入点的信息
	for(i = 0; i<G.vexnum; ++i) {
		for(j = 0; j<G.vexnum; ++j)
			G.arcs[i][j] = 0;
	} //初始化邻接矩阵,边的权值均置为极大值

	for(k = 0; k<G.arcnum; ++k) { //构造邻接矩阵
		cin>>v1>>v2; //输入一条边依附的顶点及权值
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);  //确定v1和v2在G中的位置
		G.arcs[i][j] = 1; //边<v1, v2>的权值置为w
		G.arcs[j][i] = G.arcs[i][j];//置<v1, v2>的对称边<v2, v1>的权值为w
	}
	return OK;
}
void DFS(AMGraph G, int v) { //深度优先搜索,图G为邻接矩阵类型,v为访问顶点元素对应数组下标
	cout<<G.vexs[v];//输出下标对应的顶点元素值
	visited[v] = true;//访问第v个顶点
	for(int w = 0; w< G.vexnum; w++) { //依次检查邻接矩阵v所在的行
		if((G.arcs[v][w]!=0)&& (!visited[w]))
			DFS(G, w); //w是v的邻接点,如果w未访问,则递归调用DFS
	}
}

void PrintAMGraph(AMGraph G) {//输出邻接矩阵
	int i,j;
	for(i=0; i<G.vexnum; i++) {
		for(j=0; j<G.vexnum; j++) {
			cout<<G.arcs[i][j]<<' ';
		}
		cout<<endl;
	}
}

int main() {
	AMGraph G;
	cout<<"创建无向图,请依次输入顶点数,边数,顶点值,每条边关联的顶点"<<endl;
	CreateUDN(G);
	cout<<"无向图对应邻接矩阵为:"<<endl;
	PrintAMGraph(G);
	cout<<"请输入要深度遍历的起始顶点值:"<<endl;
	VerTexType V;
	cin>>V;
	int k = LocateVex(G, V);//获取初始遍历顶点元素值
	cout<<"深度优先遍历结果为:"<<endl;
	DFS(G, k);
	return 0;
}

运行截图:

在这里插入图片描述

总结:

1,邻接矩阵表示法的优点:直观、简单、好理解,方便检查任意一对顶点间是否存在边,方便找任一顶点的所有“邻接点”(有边直接相连的顶点),方便计算任一顶点的“度”。
2,邻接矩阵表示法的缺点:判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。
3,邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。
4,对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。空间复杂度:邻接矩阵为O(n2),有向和无向图的邻接表O(n+e)和O(n+2e)。
5,邻接矩阵多用于稠密图,而邻接表多用于稀疏图。
6,深度优先搜索:从同一顶点起始深度遍历的结果不一定唯一访问完当前结点访问其邻接点,访问每个顶点的判断和操作方法相同。
7,广度优先搜索:从图的某一结点出发,首先依次访问该结点的所有邻接点V1,V2,…Vn,再按这些顶点被访问的先后次序依次访问与它们相邻接的所有未被访问的顶点,重复此过程直至所有顶点均被访问位置。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:04:09  更:2021-09-11 19:05:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:32:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码