我正在尝试在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);
}
我需要你的帮助来实现完整的算法或至少一些建议。非常感谢。提前谢谢。
答案 0 :(得分:0)
这听起来像是家庭作业,所以我会告诉你我将如何处理这个问题。
首先,修改DFS实现以使用显式堆栈而不是递归。创建一个新数组int stack[10];
和一个变量int stacksize = 0;
。我们的想法是stack[0], stack[1], ..., stack[stacksize-1]
将对应于i
最外层主动调用到最里面的DFS
个参数。我会把细节留下来,因为我确信在这方面还有其他问题/答案对。
其次,每当图形具有返回到访问顶点的边缘时,从堆栈顶部扫描回到访问顶点,寻找最重的边缘。找到后,通过修改G
删除该边缘。要重新启动深度优先搜索,请弹出堆栈,直到弹出已删除边缘的其中一个端点。每次弹出内容时,请清除其访问过的标志。深度优先搜索从这里继续(完全重启不是必需的,因为它会在这里执行相同的操作)。