前言
还是自用版,选择一套简洁的自己记忆下来,伪码哦
正文
存储结构
首先是存储结构,一般常用到的是邻接矩阵和邻接表。
邻接矩阵
#define MaxSize 100;
typedef char VertseType;
typedef int EdegeType;
typedef struct{
VertseType Vex[MaxSize];//顶点信息表
EdegeType Edge[MaxSize][MaxSize];//邻接矩阵,边表
int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph
邻接表
#define MaxSize 100
typedef struct ArcNode{ //边表结点
int adjvex; //该弧所指向顶点的位置
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode
typedef struct VNode{ //顶点表结点
VertseType data; //顶点信息
ArcNode *firstarc; //指向第一条依附在该结点的指针
}VNode,AdjList[MaxSize];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph
DFS遍历
图的深度搜索遍历,类似于二叉树的先序遍历,
用邻接表表示时,时间复杂度为O(|v|+|E|)
用邻接矩阵表示时,时间复杂度为O(|v|2)
void DFSTraverse(ALGraph G)
{
for(v=0;v<G.vexnum;v++)
visited[v]=false;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
}
bool visited[MaxSize];
void DFS(ALGraph G,int v){
visited[v]=true;
ArcNode *p;
visit(v);//访问该结点
p=G.vertices[v].firstarc;
while(p){
int w=p.adjvex;
if(visted[w]==false)//若该结点未被访问
DFS(G,w);//循环遍历
p=p->nextarc;/获得下一边结点
}
}
BFS遍历
图的广度搜索遍历,类似于二叉树的层序遍历
用邻接表表示时,时间复杂度为O(|v|+|E|)
用邻接矩阵表示时,时间复杂度为O(|v|2)
void BFSTraverse(ALGraph G)
{
for(v=0;v<G.vexnum;v++)
visited[v]=false;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
BFS(G,v);
}
bool visited[MaxSize];
void BFS(ALGraph G,int v){
initQueue(Q);//初始化队列
ArcNode *p;
visit(v);//访问该结点
visited[v]=true;
EnQueue(Q,v);//入队
while(!isEmpty(Q)){
DeQueue(Q,v);//出队
p=G.vertices[v].firstarc;
while(p){
int w=p->adjvex;
if(visited[w]==false){//若该结点未被访问
visit(w);
EnQueue(Q,w);
visited[w]=true;
}
p=p->nextarc;//获得下一边结点
}
}
}
贴一个有详细代码的文章https://blog.csdn.net/qq_42845341/article/details/101929645