图的学习
一、图的存储及BFS、DFS算法
1.1、邻接矩阵法
特点:
- 无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。
- 对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是顶点i的度TD(vi)。
- 对于有向图,邻接矩阵的第i行非零元素(或非∞元素)的个数正好是顶点i的出度OD(vi);第i列非零元素(或非∞元素)正好是顶点i的入度ID(vi)。
- 用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
- 稠密图适合使用邻接矩阵的存储表示
- 设图G的邻接矩阵为A,An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目。
- 邻接矩阵实现BFS和DFS算法的空间复杂度均为O(|V|),时间复杂度均为O(|V|2)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MaxVertexNum 100 //顶点数目的最大值
#define Max 0x7FFFFFFF //int最大数
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
int vexnum,arcnum;//图的当前顶点数和弧数
}MGragh;
//链表
typedef struct LinkNode{
int val;//数据域
struct LinkNode *next;//指针域
}LinkNode,*LinkedList;
//链式存储队列
typedef struct LinkedQueue{
LinkedList front,rear;
}LinkedQueue;
//初始化队列
void Init_LinkedQueue(LinkedQueue &q){
q.front=q.rear=(LinkedList)malloc(sizeof(LinkNode));//建立队头和队尾
q.front->next=NULL;
}
//判队空
bool is_Empty(LinkedQueue &q){
if(q.front==q.rear){
return true;
}
return false;
}
//入队
void EnQueue(LinkedQueue &q,int x){
LinkedList newNode=(LinkedList)malloc(sizeof(LinkNode));//新结点
newNode->val=x;
newNode->next=NULL;
//插入新结点
q.rear->next=newNode;
q.rear=newNode;
return;
}
//出队
bool DeQueue(LinkedQueue &q,int &x){
if(is_Empty(q)){
return false;
}
//获取被删结点
LinkedList p=q.front->next;
x=p->val;
//删除结点
q.front->next=p->next;
if(q.rear==p){
q.rear=q.front;
}
free(p);
return true;
}
//找出图G的x顶点的第一个邻接点
//若有则返回顶点号。若没有返回-1
int FirstNeighbor(MGragh G,int x){
if(x<0||x>=G.vexnum){//判断图是否存在以及查找顶点是否在表其中,不在的话直接返回-1
return -1;
}
for(int i=0;i<G.vexnum;i++){
if(G.Edge[x][i]==1){
return i;//查找到第一个邻接点
}
}
return -1;
}
//找出图G的x顶点的y的下一个邻接点
//若有则返回顶点号。若没有返回-1
int NextNeighbor(MGragh G,int x,int y){
if(x<0||x>=G.vexnum||y<0||y>=G.vexnum){//判断图是否存在以及查找顶点是否在表其中,不在的话直接返回-1
return -1;
}
for(i

本文详细介绍了图的存储结构,包括邻接矩阵、邻接表、十字链表和邻接多重表,并提供了BFS和DFS算法的实现。针对无向图和有向图的特点,分析了各种存储方法的优缺点,以及在空间和时间复杂度上的考虑。通过实例代码展示了如何在C语言中实现这些数据结构和算法。
最低0.47元/天 解锁文章
1319

被折叠的 条评论
为什么被折叠?



