【问题标题】:Using a DFS to compute distance from source node使用 DFS 计算与源节点的距离
【发布时间】:2016-03-10 00:40:08
【问题描述】:

我正在尝试使用 DFS 算法来计算每个节点与源节点的距离。目前,它为源顶点输出距离 0,但为所有其他顶点输出 1,即使应该有一对距离为 2。DFS 中的 printf 确实打印出正确的顺序,首先是源,然后是距离为 1,然后距离为 2 的顶点。所以我需要在算法中的哪个位置增加距离。

void dfs(int vertex1) {
    graph[vertex1-1].visited = 1;
    printf("%d \n",vertex1);
    struct edge *e;
    e = graph[vertex1-1].edgePtr;

    while (e) {
        if (!(graph[e->vertexIndex - 1].visited)){
            graph[e->vertexIndex - 1].distance++;  
            dfs(e->vertexIndex);
        }     
        e = e->edgePtr;
    }
}

【问题讨论】:

  • 样式说明:vertex1 应该是一个数组索引,即介于0N-1 之间的数字,其中 N 是顶点数。如果您希望用户看到介于 1 和 N 之间的顶点数,请在 printf 中进行调整,即 printf("%d\n",vertex1+1);
  • 主题:使用 DFS 是有问题的,因为您可以穿越多个顶点,并到达起点旁边的顶点。所以 DFS 实际上并没有给你你想要找到的信息。您应该进行 BFS,因为 BFS 将访问起始顶点旁边的所有顶点,然后再冒险更远。
  • 是的,当我确保它可以工作时,我将删除此函数中的 printf,但在较低的函数中,当我打印出实际距离时,我确实做到了,所以顶点 1 显示1 而不是 0 等等。
  • 是的......我不确定如何使用这个结构来实现它

标签: c graph-theory adjacency-list


【解决方案1】:

我想我已经找到了一种让 DFS 计算距离的方法,它是正确的,除了最后一个顶点发现它说距离是 3 而不是 2。

5
(2,3)
(1,4)
(1,3)
(3,4)
(4,5)

#include <stdio.h>
#include <stdlib.h>
#include "../HW3/input_error.h"
#define VertexToSearch 1

typedef struct edge {
    int vertexIndex;
    struct edge *edgePtr;
} edge;

typedef struct vertex {
    int vertexKey;
    struct edge *edgePtr;
    int visited;
    int distance;
} vertex;

int vertexCount = 0;
struct vertex graph[];
void load_file(char*);
void insertEdge(int, int, struct vertex[]);
void InsertVertex(int, struct vertex[]);
void printGraph();
void dfs();
void print_distances();
enum error program_error;
int count;

int main(int argc, char** argv) {
    load_file(argv[1]);
    printGraph();
    dfs(VertexToSearch);
    print_distances();
    return 0;
}

void load_file(char* filename) {

    int vertex1;
    int vertex2;
    FILE* file = fopen(filename, "r");

    if (file == NULL) {
        printf("%s did not open\n", filename);
        program_error = FILE_FAILED_TO_OPEN;
        exit(program_error);
    }

    fscanf(file, "%d", &count);
    graph[count];
    for (int i = 0; i < count; i++) {
        InsertVertex(i+1, graph);
    }
    for (int i = 0; i < count; i++) {
        fscanf(file, "\n(%d,%d)", &vertex1, &vertex2);
        insertEdge(vertex1, vertex2, graph);
    }
    fclose(file);
}

void InsertVertex(int vertexKey, struct vertex graph[]) {
    graph[vertexCount].vertexKey = vertexKey;
    graph[vertexCount].edgePtr = NULL;
    graph[vertexCount].visited = 0;
    graph[vertexCount].distance = 0;
    vertexCount++;
}

void insertEdge(int vertex1, int vertex2, struct vertex graph[]) {
    struct edge *e, *e1, *e2;
    e = graph[vertex1 - 1].edgePtr;
    while (e && e->edgePtr) {
        e = e->edgePtr;
    }
    e1 = (struct edge *) malloc(sizeof (*e1));
    e1->vertexIndex = vertex2;
    e1->edgePtr = NULL;
    if (e)
        e->edgePtr = e1;
    else
        graph[vertex1 - 1].edgePtr = e1;

    e = graph[vertex2 - 1].edgePtr;
    while (e && e->edgePtr) {
        e = e->edgePtr;
    }
    e2 = (struct edge *) malloc(sizeof (*e2));
    e2->vertexIndex = vertex1;
    e2->edgePtr = NULL;
    if (e)
        e->edgePtr = e2;
    else
        graph[vertex2 - 1].edgePtr = e2;
}

void printGraph() {
    int i;
    struct edge *e;
    for (i = 0; i < vertexCount; i++) {
        printf("%d(%d)", i+1, graph[i].vertexKey);
        e = graph[i].edgePtr;
        while (e) {
            printf("->%d", e->vertexIndex);
            e = e->edgePtr;
        }
        printf("\n");
    }
}

void dfs(int vertex1) {
    graph[vertex1 - 1].visited = 1;

    printf("%d \n", vertex1);
    struct edge *e;
    e = graph[vertex1 - 1].edgePtr;
    for (int i = 0; i < count; i++) {
        if (graph[i].visited == 0 && e->vertexIndex != VertexToSearch) {
            graph[i].distance++;
        }
    }
    while (e) {
        if (!(graph[e->vertexIndex - 1].visited)) {
            dfs(e->vertexIndex);
        }
        e = e->edgePtr;
    }
}
void print_distances(){
    for(int i = 0;i < count; i++){
           printf("%d %d\n", i+ 1,graph[i].distance);
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2021-11-03
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多