图篇

来源:互联网 发布:淘宝积分有什么用 编辑:程序博客网 时间: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是顶点关系类型。对无向图,用10表示是否相邻;

                           //对有向图,则为权值类型。

       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);

}

原创粉丝点击