最近学习了DFS还有BFS,刚刚接触,用的还不是很熟练,用一篇博客来记录一下加深自己的印象。
自己对于DFS算法的认识:就像在隧道中开灯一样,随意走,一直走到那个点的任何一条路灯都亮了,再返回到上一个点寻找,一直到所有的灯都亮
#include<stdio.h>
#include<string.h>//后续需要清空数组
#include<stdlib.h>
int a[100][100];//表示两个点之间是否有边
int visited[100],ans[100],p;//Vi是记录该点是否已经被访问
//ans是存储访问的数据,p是数组ans的下标
//数组开在全局是为了在函数中方便使用
void DFS(int t,int k)//t为开始的点,k为总共有几个点
{
int i;
for(i=0; i<k; i++)//检测和开始的点相连的编号靠前的且没有
//被读取的点
{
if(visited[i]==0&&a[t][i]==1)//初始点到这个点
//有边,并且该点没被访问过
{
visited[i]=1;
ans[p++]=i;//将该点数据存入数组
DFS(i,k);//以该点为初始点继续进行DFS
}
}
}
int main()
{
int n,k,m,u,v;
scanf("%d",&n);
while(n--)
{
memset(a,0,sizeof(a));
memset(ans,0,sizeof(ans));
memset(visited,0,sizeof(visited));
scanf("%d %d",&k,&m);
while(m--)
{
scanf("%d %d",&u,&v);
a[u][v]=1;
a[v][u]=1;//无向图需要两个都做标记
}
int t=0,i;
p=1;
ans[0]=0;//从小到大进行遍历,自然先从编号为0的开始
visited[0]=1;//访问后标记
DFS(t,k)
for(i=0; i<k; i++)//输出
{
if(i==0)
printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}