使用C中的深度优先搜索找到最小生成树

时间:2014-12-25 20:39:03

标签: c algorithm graph depth-first-search minimum-spanning-tree

我正在尝试在c中实现一个使用DFS查找MST的算法。我已经找到了DFS algortihm,我理解得很好。我也知道我应该按照这些步骤来达到我的目的:

1运行DFS直到找到后退边缘或DFS停止。如果停止返回G。

2在由向后边缘构造的圆上找到最重的边缘并将其从G中移除。

3返回1.

这是DFS代码:

#include<stdio.h>
void DFS(int);
int G[10][10],visited[10],n;    //n is no of vertices and graph is sorted in array G[10][10]
void main()
{
    int i,j;

printf("Enter number of vertices:");
scanf("%d",&n);

    //read the adjecency matrix
    printf("\nEnter adjecency matrix of the graph:");
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            fscanf("%d",&G[i][j]);

    //visited is initialized to zero
    for(i=0;i<n;i++)
        visited[i]=0;

    DFS(0);
}
void DFS(int i)
{
    int j;
printf("\n%d",i);
visited[i]=1; // éviter cycle
for(j=0;j<n;j++)
    if(!visited[j]&&G[i][j]==1)
        DFS(j);
}

我需要你的帮助来实现完整的算法或至少一些建议。非常感谢。提前谢谢。

1 个答案:

答案 0 :(得分:0)

这听起来像是家庭作业,所以我会告诉你我将如何处理这个问题。

首先,修改DFS实现以使用显式堆栈而不是递归。创建一个新数组int stack[10];和一个变量int stacksize = 0;。我们的想法是stack[0], stack[1], ..., stack[stacksize-1]将对应于i最外层主动调用到最里面的DFS个参数。我会把细节留下来,因为我确信在这方面还有其他问题/答案对。

其次,每当图形具有返回到访问顶点的边缘时,从堆栈顶部扫描回到访问顶点,寻找最重的边缘。找到后,通过修改G删除该边缘。要重新启动深度优先搜索,请弹出堆栈,直到弹出已删除边缘的其中一个端点。每次弹出内容时,请清除其访问过的标志。深度优先搜索从这里继续(完全重启不是必需的,因为它会在这里执行相同的操作)。