DFS(深度搜索)

最近学习了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;
}
上一篇:poj3176


下一篇:【ybt金牌导航2-2-1】最长公共子串