我正在尝试使用覆盖所有节点的起始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语言的解决方案。
答案 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
向下移动到点。
打印订单的反面将具有您想要的属性。
如果您需要打印正确的订单,那么,例如,您可以在访问时按下堆栈上的节点。搜索完成后,弹出并打印,直到堆栈为空。