DFS在C

时间:2017-05-14 00:35:21

标签: c algorithm data-structures graph dfs

我正在尝试使用覆盖所有节点的起始vertex 0来打印图形遍历,并且应该在“定向到”之前访问“从中引导”顶点。我在下面用预期的输出解释了我的问题。这是代码,

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    struct node *next;
    int vertex;
}node;

node *G[20];   
//heads of linked list
int visited[20];
int n;
void read_graph(); 
//create adjacency list
void insert(int,int);  
//insert an edge (vi,vj) in te adjacency list
void DFS(int);

void main()
{
    int i;
    read_graph();
    //initialised visited to 0

    for(i=0;i<n;i++)
        visited[i]=0;

    DFS(0);
}

void DFS(int i)
{
    node *p;

    printf("\n%d",i);
    p=G[i];
    visited[i]=1;
    while(p!=NULL)
    {
       i=p->vertex;

       if(!visited[i])
            DFS(i);
        p=p->next;
    }
}

void read_graph()
{
    int i,vi,vj,no_of_edges;
    printf("Enter number of vertices:");

    scanf("%d",&n);

    //initialise G[] with a null

    for(i=0;i<n;i++)
    {
        G[i]=NULL;
        //read edges and insert them in G[]

        printf("Enter number of edges:");
           scanf("%d",&no_of_edges);

           for(i=0;i<no_of_edges;i++)
        {
            printf("Enter an edge(u,v):");
            scanf("%d%d",&vi,&vj);
            insert(vi,vj);
        }
    }
}

void insert(int vi,int vj)
{
    node *p,*q;

    //acquire memory for the new node
    q=(node*)malloc(sizeof(node));
    q->vertex=vj;
    q->next=NULL;

    //insert the node in the linked list number vi
    if(G[vi]==NULL)
        G[vi]=q;
    else
    {
        //go to end of the linked list
        p=G[vi];

        while(p->next!=NULL)
            p=p->next;
        p->next=q;
    }
}

它遍历所有节点,输出: -

Enter the number of vertices : 6
Enter the number of edges : 6
Enter an edge (u, v) :- 0 1
Enter an edge (u, v) :- 1 2
Enter an edge (u, v) :- 0 4
Enter an edge (u, v) :- 4 5
Enter an edge (u, v) :- 2 3
Enter an edge (u, v) :- 5 3

It is giving output :- 0 1 2 3 4 5

但是,如果我们仔细观察,(u, v) = (2, 3)(u, v) = (5, 3)我们正在访问3之前的5。5也指向3。 我的预期输出应为: - 0 4 5 1 2 3我们访问每个顶点,并在u之前访问v

我只了解C并且更喜欢使用C语言的解决方案。

3 个答案:

答案 0 :(得分:0)

据我所知,你的代码实现是正确的,基本上你的图表看起来像这样

0 -> 1 -> 2 -> 3
 \            /
  4 -------> 5

所以你的输出0,1,2,3,4,5也是DFS方法的正确输出,但如果具体你想要你的解决方案是0,4,5,1,2,3 - &gt;那么设置有向图的输入顺序应采用这种格式

Enter the number of vertices : 6
Enter the number of edges : 6
Enter an edge (u, v) :- 0 4 
Enter an edge (u, v) :- 4 5
Enter an edge (u, v) :- 0 1
Enter an edge (u, v) :- 1 2
Enter an edge (u, v) :- 2 3
Enter an edge (u, v) :- 5 3

It should give output as 0,4,5,1,2,3

希望这有帮助!

答案 1 :(得分:0)

您使用的是错误的工具。深度优先搜索确实必须在“指向”之前访问“指示自”。

这是一个可以胜任的算法:

首先,使用DFS(或任何其他搜索)构造可从起始顶点到达的顶点列表。这样做默默地,什么都不打印。

然后在列表中找到顶点V,使得列表中的顶点没有边缘到V,打印V,并从列表中删除V.重复此步骤,直到列表为空。

答案 2 :(得分:0)

维持边缘关系的总订单称为topological sort。您可以使用DFS访问拓扑排序,该DFS访问后期订单中的所有顶点。但是,后期订单是您想要的反向

您的代码访问预订中的节点:它会在访问其子节点之前打印每个节点。因此,在搜索子项后,将printf向下移动到点。

打印订单的反面将具有您想要的属性。

如果您需要打印正确的订单,那么,例如,您可以在访问时按下堆栈上的节点。搜索完成后,弹出并打印,直到堆栈为空。