深度优先搜索算法—DFS

深度优先搜索算法—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的数组)

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

深度优先搜索算法—DFS_第1张图片


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

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

结果示例:

深度优先搜索算法—DFS_第2张图片


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

你可能感兴趣的:(数据结构与算法)