图的遍历

来源:互联网 发布:魔仙晶石链淘宝 编辑:程序博客网 时间:2024/05/18 04:49

一 图的深度优先遍历
1.算法思想
类似树的先根遍历。设初始化时,图中各顶点均未被访问,从图中某个顶点(设为V0)出发,访问V0,然后搜索V0的一个邻接点Vi,若Vi未被访问,则访问之,在 搜索Vi的一个邻接点(深度优先)…。若某顶点的邻接点全部访问完毕,则回溯到它的上一顶点,然后再从此顶点又按深度优先的方法搜索下去,…,直到能访问的顶点都访问完毕为止。
2.算法实现(C语言)

#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef char VertexType;typedef struct ArcNode{    int adjvex;    struct ArcNode *nextarc;} ArcNode;typedef struct VNode{    VertexType data;    ArcNode *firstarc;} VNode;typedef struct ALGraph{    VNode adjlist[MAXSIZE];    int vexnum,arcnum;} ALGraph;int visited[MAXSIZE] = {0};//创建图ALGraph CreateALGraph(ALGraph G){    int i,j,k;    ArcNode *p,*q;    printf("请输入顶点数和边数:\n");    scanf("%d,%d",&(G.vexnum),&(G.arcnum));    printf("请输入顶点信息:\n");    for(i = 0; i < G.vexnum; i ++)    {        fflush(stdin);        scanf("%c",&(G.adjlist[i]));        G.adjlist[i].firstarc = NULL;    }    printf("请输入边的信息:\n");    for(k = 0; k < G.arcnum; k ++)    {        scanf("%d,%d",&i,&j);        //i为弧尾,j为弧头        p = (ArcNode *)malloc(sizeof(ArcNode));        p->adjvex = j;        p->nextarc = G.adjlist[i].firstarc;        G.adjlist[i].firstarc = p;        //j为弧尾,i为弧头        q = (ArcNode *)malloc(sizeof(ArcNode));        q->adjvex = i;        q->nextarc = G.adjlist[j].firstarc;        G.adjlist[j].firstarc = q;    }    return G;}void DFS(ALGraph G,int v){    ArcNode *p;    printf("%c",G.adjlist[v].data);    visited[v] = 1;    p = G.adjlist[v].firstarc;    while(p != NULL)    {        if(visited[p->adjvex] == 0)        {            DFS(G,p->adjvex);        }        p = p->nextarc;    }}int main(){    ALGraph G;    G = CreateALGraph(G);    printf("遍历结果为:");    DFS(G,0);    return 0;}

二 图的广度优先遍历
1.算法思想
类似树的按层次遍历。初始时,图中各顶点均未被访问,从图中某顶点(V0)出发,访问V0,并依次访问V0的各邻接点(广度优先)。然后,分别从这些被访问过的顶点出发,扔仍按照广度优先的策略搜索其它顶点,….,直到能访问的顶点都访问完毕为止。
为控制广度优先的正确搜索,要用到队列技术,即访问完一个顶点后,让该顶点的序号进队。然后取相应队头(出队),考察访问过的顶点的各邻接点,将未访问过的邻接点访问 后再依次进队,…,直到队空为止。
2.算法实现(C语言)

#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef char VertexType;typedef struct ArcNode{    int adjvex;    struct ArcNode *nextarc;} ArcNode;typedef struct VNode{    VertexType data;    ArcNode *firstarc;} VNode;typedef struct ALGraph{    VNode adjlist[MAXSIZE];    int vexnum,arcnum;} ALGraph;int visited[MAXSIZE] = {0};//创建图ALGraph CreateALGraph(ALGraph G){    int i,j,k;    ArcNode *p,*q;    printf("请输入顶点数和边数:\n");    scanf("%d,%d",&(G.vexnum),&(G.arcnum));    printf("请输入顶点信息:\n");    for(i = 0; i < G.vexnum; i ++)    {        fflush(stdin);        scanf("%c",&(G.adjlist[i]));        G.adjlist[i].firstarc = NULL;    }    printf("请输入边的信息:\n");    for(k = 0; k < G.arcnum; k ++)    {        scanf("%d,%d",&i,&j);        //i为弧尾,j为弧头        p = (ArcNode *)malloc(sizeof(ArcNode));        p->adjvex = j;        p->nextarc = G.adjlist[i].firstarc;        G.adjlist[i].firstarc = p;        //j为弧尾,i为弧头        q = (ArcNode *)malloc(sizeof(ArcNode));        q->adjvex = i;        q->nextarc = G.adjlist[j].firstarc;        G.adjlist[j].firstarc = q;    }    return G;}void Visit(ALGraph G,int v){    printf("%c",G.adjlist[v].data);}void BFS(ALGraph G,int v){    ArcNode *p;    int j;    int que[MAXSIZE];    int rear,front;    rear = front  = 0;    Visit(G,v);    visited[v] = 1;    //当前顶点入队    que[rear] = v;    rear = (rear+1)%MAXSIZE;    //队空时说明遍历完成    while(front != rear)    {        //顶点出队        j = que[front];        front = (front+1)%MAXSIZE;        p = G.adjlist[j].firstarc;        while(p != NULL)        {            //当前顶点未被访问则进队            if(visited[p->adjvex] == 0)            {                Visit(G,p->adjvex);                visited[p->adjvex] = 1;                //该顶点入队                que[rear] = p->adjvex;                rear = (rear+1)%MAXSIZE;            }            //p指向j的下一条边            p = p->nextarc;        }    }}int main(){    ALGraph G;    G = CreateALGraph(G);    printf("遍历结果为:");    BFS(G,0);    return 0;}
0 0