图篇
来源:互联网 发布:淘宝积分有什么用 编辑:程序博客网 时间:2024/05/01 14:03
<<------表示方法------>>
1.图的数组(邻接矩阵)表示法
用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。
#define INFINITY INT_MAX //最大值∞
#define MAXV 20 //最大顶点个数
typedef enum { DG, DN, UDG, UDN } GraphKind; //{有向图,有向网,无向图,无向网}
typedef struct ArcCell //表边或弧
{
VRType adj; //VRType是顶点关系类型。对无向图,用1或0表示是否相邻;
//对有向图,则为权值类型。
InfoType *info; //该弧相关信息的指针
}ArcCell, AdjMatrix[MAXV][MAXV];
typedef struct
{
VertexType vexs[MAXV]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum, arcnum; //图的顶点数和弧数
GraphKind kind; //图的种类标志
}MGraph;
1. 图的邻接表表示法
邻接表是图的一种链式存储结构。在邻接表中,对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。每个结点有3个域组成,其中领结点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个表头结点。在表头结点中,除了设有链域(firstarc)指向链表中第一个结点之外,还设有存储顶点vi的名或其他信息的数据域(data)。如下图:
表节点(adjvex; nextarc; info)【表边或弧】
头结点(data; firstarc) 【链表的表头结点】
这些表头结点通常以顺序结构的形式存储。
#define MAXV 20 //最大顶点个数
typedef struct ArcNode //表结点,表边(弧)
{
int adjvex; //该弧指向的顶点位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode //头结点,表头顶点
{
VertexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MAXV];
typedef struct
{
AdjList adjlist;
int vexnum, arcnum;
int kind;
}ALGraph;
<<------常用算法------>>
1. 图的深度优先遍历
▼递归算法:
#define MAXV 100;
int visited[MAXV]; //表示顶点是否被访问过
void DFS(ALGraph *G, int v) //表结构为邻接表
{
ArcNode *p;
for( i=0; i<G->vexnum; i++) visited[i] = 0; //遍历每一个顶点,将其设为未被访问
visited[v] = 1; printf("%d", v); //访问起始点
p = G->adjlist[v].firstarc; //取顶点头结点为v的第一个弧
while(p != NULL)
{
if(visited[p->adjvex] == 0)
DFS(G, p->adjvex);
p = p->nextarc;
}
}
上述算法针对连通图,若图非连通,则有:
void DFS1(ALGraph *G)
{
for( i=0; i<G->vexnum; i++)
if(visited[i] == 0)
DFS(G, i);
}
▼非递归算法:
2. 图的广度优先遍历
▼递归算法:
▼非递归算法:
#define MAXV 100;
int visited[MAXV]; //表示顶点是否被访问过
void BFS(ALGraph *G, int v)
{
ArcNode *p;
SqQueue Q; InitQueue(Q);
for(i=0; i<vexnum; i++) visited[i] = 0;
visited[v] = 1; printf("%d", v);
Q.base[Q.rear] = v; Q.rear++; //起始点入队
while(!QueueEmpty(Q))
{
k = Q.base[Q.front]; Q.front++; //队首元素出队
p = G->adjlist[k].firstarc; //取该顶点的第一条弧
while(p != NULL) //遍历以k顶点出发的所有弧
{
if(visited[p->adjvex] ==0)
{
visited[p-adjvex] = 1; printf("%d", p->adjvex);
Q.base[Q.rear] = p->adjvex; Q.rear++;
}
p = p->nextarc;
}
}
}
上述算法针对连通图,若图非连通,则有:
void BFS1(ALGraph *G)
{
for( i=0; i<G->vexnum; i++)
if(visited[i] == 0)
BFS(G, i);
}
- 图篇
- LeetCode总结 -- 图篇
- 【慢速学数据结构】图篇
- 数据结构探险——图篇
- SilverLight 4页面跳转大全
- 在winxpsp3下用TransEdit3.5.4扫描频道自动关机故障
- Windows 7下使用VMware vSphere Client
- MERGE语句的使用(复制表)
- 在web html页面中,打印、预览当前页面
- 图篇
- 编写脚本使用的COM组件
- 端午百望山爬山活动-金山词霸运营团队活动
- ASP.NET中各命名空间及作用
- getchar()和EOF总结
- 查找、检索 算法-总结4 红黑树 [RBT]
- No way to map to an envelop schema without use of orchiestration.
- Linux系统调用--fcntl函数详解
- HTML DOM对象与JavaScript对象之比较