本文主要是介绍DFS(不成熟版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要有一个数组来存该点是否被标记,如果该点被访问了要标记,直到访问完了所有的点。用递归,递归传入的就是访问到的新一个点,要对它进行标记访问过了,再去遍历该点的邻接结点,看能不能进行访问。
#include<iostream>
#include<algorithm>
using namespace std;
int n;//顶点的个数 其实更好应该写进结构体中
struct Graph {//图的结构体char A[10];//存顶点信息int infor[50][50];//存图的信息权值int vistied[10];//判断该点是否被访问};
int found(char a,Graph &g)//该点对应的下标
{for (int i = 1; i <= n; i++){if (a == g.A[i])return i;}
}
int spot2(int i,int j, Graph &g)//查找第二个邻接点 j是第一个邻接点需要把j传进来 避免重复
{//这个是用在广度搜索中int MIN2 = 999;int b2=0;int flag = 1;for (int k = 1; k <= n; k++){if (k != j && g.infor[i][k] != 999&&g.vistied[k]==1&& g.infor[i][k]<MIN2){MIN2 =g.infor[i][k];flag = 0;b2 = k;}}if (flag == 0){return b2;}else{return 0;}
}
int spot(int i, Graph &g)//查找邻接点且权值最小(第一个邻接点)
{//这个是用在广度搜索中int MIN = 9999;int b=0;//邻接点的下标int flag = 1;for (int j = 1; j <= n; j++){if (g.infor[i][j] != 999 && g.vistied[j] == 1&& g.infor[i][j]<MIN){MIN =g.infor[i][j];flag = 0;b = j;}}if (flag == 0){return b;}else{return 0;}
}
void dfs(int i, Graph &g)//传入一个点 深度搜索
//递归结束的条件就是所有的点都访问完
{cout << g.A[i]<<" ";g.vistied[i] = 0;for (int w = 1;w<=n; w++)//i点到他的邻接点(这里可以理解为递归终止的条件){if (g.vistied[w] == 1 && g.infor[i][w] != 999){//把w点作为新的顶点去递归//cout << w << endl;dfs(w, g);}}}
int main()
{Graph g;cin >> n;//顶点个数for (int i = 1; i <= n; i++){char gg;cin >> gg;g.A[i]=gg;//存入顶点信息g.vistied[i] = 1;}//先要给图初始化 即所有的权值设置成无限大for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){g.infor[i][j] = 999;}}// 再对图的信息进行改变for (int i = 0; i < n - 1; i++)//存入图的边的信息{char a, b;//需要写个函数来查找该点对应的数组下标int c;cin >> a >> b >> c;int x = found(a, g);int y = found(b, g);cout << x << y << endl;g.infor[x][y] = c;g.infor[y][x] = c;//无向图//需要有个函数来查找某个点的邻接点而且是最小的}cout << "请输入一个起点";char h;cin >> h;int p = found(h, g);dfs(p, g);return 0;
}
这篇关于DFS(不成熟版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!