1068: 图的按录入顺序深度优先搜索
题目描述
图的深度优先搜索类似于树的先根遍历,即从某个结点开始,先访问该结点,然后深度访问该结点的第一棵子树,依次为第二顶子树。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”至“Z”中的若干字符表示,且要求结点的访问顺序根据录入的顺序进行访问。如果结点录入的顺序为HUEAK,从H开始进行深度优先搜索,则可能的搜索结果为:H->A->K->U>E.
输入
第一行为一个整数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的整数矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相应的边的长度。最后一行为一个字符,表示要求进行深度优先搜索的起始顶点。
输出
用一行输出深度优先搜索结果,起始点为给定的顶点。
样例输入
5
HUEAK
0 0 2 3 0
0 0 0 7 4
2 0 0 0 0
3 7 0 0 1
0 4 0 1 0
H
样例输出
HEAUK
思路:
DFS:从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就回溯到上一个节点,然后从另一条路开始走到底
如例题所示:该DFS的路径为H=>E=>(H)=>A=>U=>K
#include<bits/stdc++.h>
using namespace std;
int visited[100]={0}; //用visited标记点是否被访问,0表示未遍历,1表示已遍历
int a[100][100]={0}; //定义为全局变量的目的是减少函数调用时邻接矩阵的传参
char s[100]; //定义为全局变量的目的是减少函数调用时邻接矩阵的传参
void creat(int n) //输入邻接矩阵
{
for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin >> a[i][j];
}
void DFS(int k, int n) //DFS基于深度优先遍历算法(一笔画思想)
{
if(visited[k]==0) //点k未被访问过时
{
visited[k]=1; //标记Vk点
cout << s[k]; //printf("%c",s[k]);输出点k对应的字符
for(int i=0;i<n;i++) //k->V0,V1,V2...Vn深度优先遍历
{
if(a[k][i]!=0) //点k到点i连通
{
DFS(i, n); //从点Vi出发
}
}
}
}
int main()
{
int n; //n为点的个数
char data; //data为起点
cin >> n >> s; //scanf("%d %s", &n, s);
creat(n);
getchar(); //吸收回车
cin >> data; //scanf("%c", data);
for(int i=0;i<n;i++)
{
if(s[i]==data)
{
DFS(i, n);
break;
}
}
return 0;
}
以上方法仅供参考,欢迎互联网广大朋友们提出指正。