图,dfs,bfs

真的大一菜鸟的dfs

dfs:

void dfs(int st,int g[][max])//必须给一个顶点开始搜索
    {
    
        static int vis[max]={0};
        //用于记录有没有被访问
        vis[st]=1;
        //开始找说有项链的节点中没有被访问过的节点
        printf("%2d->",st);
        for(int i=0;i<v;i++)
        {
            //条件:1相连2未访问
            if(g[st][i]==1&&vis[i]==0)
            {
                dfs(i,g);
            }
        }
    }

bfs;

   void bfs(int st,int g[][max])
    {
        //用于存储访美访问过的数据
        int vis[max]={0};
        //定义队列,
        int que[max],h,r,temp;
        //空
        h=r=0;
        //尾进
        que[r]=st;
        r++;
        vis[st]=1;
        while(h!=r)
        {
            //出一个已经记住的元素;
            temp=que[h];
            h++;
            //vis[temp]=1;
            printf("%3d->",temp);
            for(int i=0;i<v;i++)
            {
                if(g[temp][i]==1 &&vis[i]==0)
                {
                    que[r]=i;
                    r++;
                    vis[i]=1;
                }
            }
        }
    
    
    }

完整代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define max 100
int v,E;

void Initial(int g[][max],int data[max][max])
{
    //输入边数减少空间

    for(int i=0;i<E;i++)
    {
        for(int j=0;j<E;j++)
        {
            int tmpi,tmpj;
			tmpi=data[i][0];//tmpi为起始顶点
			tmpj=data[i][1];//tmpj为终止顶点
			g[tmpi][tmpj]=1;//有边的点填入1
        }
    }


}
void dfs(int st,int g[][max])//必须给一个顶点开始搜索
{

    static int vis[max]={0};
    vis[st]=1;
    //开始找说有项链的节点中没有被访问过的节点
    printf("%2d->",st);
    for(int i=0;i<v;i++)
    {
        //条件:1相连
        if(g[st][i]==1&&vis[i]==0)
        {
            dfs(i,g);
        }
    }
}
void Dispaly(int g[][max])
{
    for(int i=0;i<v;i++)
    {
        for(int j=0;j<v;j++)
        {
            printf("%4d",g[i][j]);
        }
        printf("\n");
    }
}
void bfs(int st,int g[][max])
{
    //用于存储访美访问过的数据
    int vis[max]={0};
    //定义队列,
    int que[max],h,r,temp;
    //空
    h=r=0;
    //尾进
    que[r]=st;
    r++;
    vis[st]=1;
    while(h!=r)
    {
        //出一个已经记住的元素;
        temp=que[h];
        h++;
        //vis[temp]=1;
        printf("%3d->",temp);
        for(int i=0;i<v;i++)
        {
            if(g[temp][i]==1 &&vis[i]==0)
            {
                que[r]=i;
                r++;
                vis[i]=1;
            }
        }
    }


}
int main()
{
    int G[max][max];
    int data[max][max];
    scanf("%d%d",&v,&E);
    for(int i=0;i<E;i++)
    {
            for(int j=0;j<2;j++)
            {
                scanf("%d",&data[i][j]);
            }
    }
    memset(G,0,sizeof(G));
    Initial(G,data);
   dfs(G[0][0],G);
   bfs(G[0][0],G);
   Dispaly(G);
    return 0;
}

//横着读第i行,可以读出1和其他相连

0 1 1 1 0 0 0
0 0 0 0 1 1 1
0 0 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 1 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

猜你喜欢

转载自blog.csdn.net/weixin_42781327/article/details/84964681