深度优先搜索算法—DFS

来源:互联网 发布:前端wap 淘宝页面模板 编辑:程序博客网 时间:2024/06/05 08:01

深度优先搜索算法—DFS

图的遍历方法主要有两种:深度优先搜索遍历(DFS)和广度优先搜索遍历


DFS

深度优先搜索遍历类似于树的先序遍历,尽可能从纵深方向进行搜索,简单来说,DFS就是想找到最长的路径,基本思想是从图某个顶点V0开始,访问此顶点,然后依次从V0的各个没有访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径连通的顶点都被访问到,若图是连通图,则遍历结束,否则,图中还有顶点未被访问,则另选图中一个未被访问的顶点作为新的出发点,重复此过程,直至图中所有顶点都被访问到。


首先看一下邻接表的数据结构:

typedef struct Node {    int vertex;    struct Node* next;}Node;   //存放链表中的结点信息typedef struct head {    char data;    Node *first;}Head, *Graph;  //Graph是一个指向邻接表的指针(指向了一个数据类型为Head的数组)

下图是一个邻接表的图示:

这里写图片描述


下面就需要建立这样一个邻接表:

Graph createGraph() {    Graph h = (Graph)malloc(sizeof(Head) * Num);   //建立数组部分     int i = 0;    for(i = 0; i < Num; i++) {        h[i].data = i + 65;        h[i].first = createLink();    }    return h;}Node* createLink() {   //建立右边的链表部分    Node *nod = NULL;    int n;     int index;    Node *node;     Node *p;    printf("请输入结点的个数: \n");    scanf("%d", &n);    printf("请输入结点的下标: \n");    scanf("%d", &index);        nod = (Node *)malloc(sizeof(Node));    nod->next = NULL;    nod->vertex = index;    p = nod;    while(--n) {        printf("请输入结点的下标: \n");        scanf("%d", &index);        node = (Node *)malloc(sizeof(Node));        node->next = p->next;        node->vertex = index;        p->next = node;        p = node;    }    return nod;}

DFS算法:

void DFS(Graph graph, int begin) {    //从begin节点出发,递归深度遍历连通图    int i;    printf("%c ", graph[begin].data);    visted[begin] = 1;    for(i = firstVertex(graph, begin); i >= 0; i = nextVertex(graph, begin, i)) {        if(!visted[i]) {            DFS(graph, i);        }    }}
void DFSTravel(Graph graph, int begin) {  //从begin开始深度优先搜索遍历图    int i;      for(i = 0; i < Num; i++) {        visted[i] = 0;    }    DFS(graph, begin);    for(i = 0; i < Num; i++) {        if(!visted[i]) {            DFS(graph, i);        }    }}

其它函数:

int nextVertex(Graph graph, int pos, int cur) {  //找到pos对应的邻接结点cur,然后返回它的下一个邻接结点的序号    Node *p = graph[pos].first;    while(p->vertex != cur) {        p = p->next;    }    if(p->next) {        return p->next->vertex;    } else {        return -1;    }} int firstVertex(Graph graph, int pos) {  //找到pos对应的第一个邻接结点的序号    if(graph[pos].first) {        return graph[pos].first->vertex;    } else {        return -1;    }}void showGraph(Graph graph) {    //展示邻接表    Node *p = NULL;    int i;    for(i = 0; i < Num; i++) {        printf("%c ", graph[i].data);        p = graph[i].first;        while(p) {            printf("%d ", p->vertex);            p = p->next;        }        printf("\n");    }   }

结果示例:

这里写图片描述


今天创建邻接表的时候,实在是没想到一次就成功的创建了邻接表,看来还是得认真 ^_^
下载链接:http://download.csdn.net/detail/dear_mr/9823146

0 0
原创粉丝点击