Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何研究图形数据结构和BFS&;DFS_C_Algorithm_Data Structures_Graph - Fatal编程技术网

C 如何研究图形数据结构和BFS&;DFS

C 如何研究图形数据结构和BFS&;DFS,c,algorithm,data-structures,graph,C,Algorithm,Data Structures,Graph,我最近在研究数据结构,我在图形方面有困难。我读了这本书 事实上,我也读了一些其他算法书籍,我发现几乎没有一本书给我一个完整的图形实现。虽然我可以阅读伪代码,了解BFS和DFS是如何运行的,以及graph中用于解决问题的一些其他算法,但我仍然需要一个完整的实现来帮助我更好地理解它是如何工作的。然而,在研究图形时,在这里编写代码不重要吗?我不确定 此外,我还发现了一些关于BFS和DFS的ACM问题。我不知道如何表达,但似乎BFS和DFS只是解决它们的想法,它们没有编写标准BFS代码。所以这让我很难研

我最近在研究数据结构,我在图形方面有困难。我读了这本书

事实上,我也读了一些其他算法书籍,我发现几乎没有一本书给我一个完整的图形实现。虽然我可以阅读伪代码,了解BFS和DFS是如何运行的,以及graph中用于解决问题的一些其他算法,但我仍然需要一个完整的实现来帮助我更好地理解它是如何工作的。然而,在研究图形时,在这里编写代码不重要吗?我不确定

此外,我还发现了一些关于BFS和DFS的ACM问题。我不知道如何表达,但似乎BFS和DFS只是解决它们的想法,它们没有编写标准BFS代码。所以这让我很难研究数据结构

很抱歉我的表达不好,我现在是一名在美国的国际学生

最后,我从中复制了这段代码并对其进行了分析。但我还是不能理解其中的一部分。下面是代码的一部分:

typedef struct BfsVertex_ {
    void *data;
    VertexColor color;
    int hops;
} BfsVertex;

typedef struct AdjList_ {
    void *vertex;
    Set adjacent;
} AdjList;

typedef struct Graph_ {
    int  vcount;
    int  ecount;
    List adjlists;
    int  (*match)(const void *key1, const void *key2);
    void (*destroy)(void *data);
} Graph;

int BFS(Graph *graph, BfsVertex *start, List *hops) {

    Queue     queue;
    AdjList   *adjlist, *clr_adjlist;
    BfsVertex *clr_vertex, *adj_vertex;
    ListElem  *element, *member;

    /* init all of the vertices in the graph */
    for (element = list_head(&graph_adjlists(graph));
         element != NULL;
         element = list_next(element)) {

        clr_vertex = ((AdjList *)list_data(element))->vertex;

        if (graph->match(clr_vertex, start)) {
            clr_vertex->color = gray;
            clr_vertex->hops = 0;
        } else {
            clr_vertex = white;
            clr_vertex->hops = -1;
        }
    }

    /* init the queue with the adjacency list of the start vertex */
    queue_init(&queue, NULL);
    if (graph_adjlist(graph, start, &clr_adjlist) != 0) {
        queue_destroy(&queue);
        return -1;
    }

    if (queue_enqueue(&queue, clr_adjlist) != 0) {
        queue_destroy(&queue);
        return -1;
    }

    /* perform Breadth-First Search */
    while (queue_size(&queue) > 0) {

        adjlist = queue_peek(&queue);

        /* traverse each vertex in the current adjacency list */
        for (member = list_head(&adjlist->adjacent);
             member != NULL;
             member = list_next(member)) {

            adj_vertex = list_data(member);

            /* determine the color of the next adjacent vertex */
            if (graph_adjlist(graph, adj_vertex, &clr_adjlist) != 0) {
                queue_destroy(&queue);
                return -1;
            }
            clr_vertex = clr_adjlist->vertex;

            /* color each white vertex gray and enqueue its adjacency list */
            if (clr_vertex->color == white) {
                clr_vertex->color = gray;
                clr_vertex->hops = ((BfsVertex *)adjlist->vertex)->hops + 1;

                if (queue_enqueue(&queue, clr_adjlist) != 0) {
                    queue_destroy(&queue);
                    return -1;
                }
            }
        }

        /* dequeue the current adjacency list and color its vertex black */
        if (queue_dequeue(&queue, (void **)&adjlist) == 0) {
            ((BfsVertex *)adjlist->vertex)->color = black;
        } else {
            queue_destroy(&queue);
            return -1;
        }
    }

    queue_destroy(&queue);

    /* pass back the hop count for each vertex in a list */
    list_init(hops, NULL);

    for (element = list_head(&graph_adjlists(graph));
         element != NULL;
         element = list_next(element)) {

        /* skip vertices that were not visited (those with hop counts of -1) */
        clr_vertex = ((AdjList *)list_data(element))->vertex;
        if (clr_vertex->hops != -1) {
            if (list_ins_next(hops, list_tail(hops), clr_vertex) != 0) {
                list_destroy(hops);
                return -1;
            }
        }
    }

    return 0;
}
我在这里遇到了麻烦:这个初始化是如何工作的?它遍历图的邻接列表,并为图中的每个顶点指定有色顶点。但在着色后,clr_顶点改变了其对象,如何保存颜色和距离信息

 /* init all of the vertices in the graph */
        for (element = list_head(&graph_adjlists(graph));
             element != NULL;
             element = list_next(element)) {

            clr_vertex = ((AdjList *)list_data(element))->vertex;

            if (graph->match(clr_vertex, start)) {
                clr_vertex->color = gray;
                clr_vertex->hops = 0;
            } else {
                clr_vertex = white;
                clr_vertex->hops = -1;
            }
        }
谢谢你读了这么长的问题

如何研究图形数据结构和BFS&DFS

一个词:抽象的

无论使用何种编程语言,您都需要理解它们。你只需要一支笔和一张纸。这将使它在实施时变得非常清晰。图形意味着是抽象对象,可以选择prog。语言与概念无关

我仍然需要一个完整的实现,帮助我更好地理解如何实现 它起作用了

DFS和BFS只是遍历(即遍历)图形的两种不同方式。不多不少。这种行走的结果就是文献中所谓的搜索树。 全面实施情况如下:

  • 手动在小图上运行DFS和BFS。(这将返回一个搜索树)

  • 对照您的实现检查它


  • 当然,这些技术太笼统了。在练习时,你可以结合其他技巧来修改它们,或者用它们做任何你想做的事情。现在,您可以将它们看作DFS=Stack,BFS=Queue

    Hmm,您能更具体一点吗<代码>clr_顶点->跳数=((BfsVertex*)调整列表->顶点)->跳数+1此行将更新每个顶点中的距离。clr_顶点是struct BfsVertex类型的指针。所以一旦你改变了它的内容,它所指向的内存的值也会改变。因此,即使在编辑该值后将其指向其他位置,它也将保持不变。