基于图的深度优先搜索(C语言)(+邻接矩阵实现bfs和dfs)

@TOC

这几周忙着国旗班训练,写博客估计也暂时慢下来,目前我就看什么就学什么吧。
最近想把书上的数据结构基本功能先实现了,再慢慢学一些算法,目前在看图,这部分不是很熟练,我就将我认为比较好理解的大佬的文章链接分享在这了 图的基本知识.,希望对大家学习图有帮助。

题目

第一行输入有向图的顶点数n和边数m,第二行输入顶点,分m行输入有向图边的信息,eg 1 2 表示点1到点2的一条弧,最后一行输入带判别的顶点vi vj
存在路径输出yes,否则输出no

代码

#include<stdio.h>
#include<stdlib.h>

#define MAX 200

typedef struct EgdeNode
{
    int endvex; //相邻顶点字段
    int weight;//边的权
    struct EdgeNode *nextedge;//链字段
}EdgeList;//边表

typedef struct {
int vertex;//顶点信息
EdgeList *edgelist;//边表头指针
}VexNode;//顶点表

typedef struct {
VexNode vexs[MAX];
int vexNum,edgeNum;//图的顶点和边个数

}GraphList;

void CreatGraphList(GraphList *G,int n,int m)
{
    G->vexNum=n;
    G->edgeNum=m;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&G->vexs[i].vertex);//创建顶点表
        G->vexs[i].edgelist=NULL;
    }
    int v1,v2;
    for(int j=0;j<m;j++)
    {
        scanf("%d %d",&v1,&v2);//创建边表
        EdgeList *g=(EdgeList*)malloc(sizeof(EdgeList));
        g->endvex=v2;
        g->nextedge=G->vexs[v1].edgelist;//头插法
        G->vexs[v1].edgelist=g;

    }
}


int DFS(GraphList *G,int v1,int v2)//和树的先,中,后序遍历很像
{
    int visited[MAX]={0};
    visited[v1]=1;
    EdgeList *g=G->vexs[v1].edgelist;
    while(g)
    {
        if(g->endvex==v2)
        {
            return 1;
        }
        if(!(visited[g->endvex])&&DFS(G,g->endvex,v2))
        {
            return 1;
            g=g->nextedge;
        }
    }
    return 0;
}

int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    GraphList *G;
    G=(GraphList*)malloc(sizeof(GraphList));
    CreatGraphList(G,n,m);
    int v1,v2;
    scanf("%d %d",&v1,&v2);
    if(DFS(G,v1,v2)){
        printf("yes\n");
    }
    else{
        printf("no\n");
    }
    return 0;

}

结果:

在这里插入图片描述
若题目为深度和广度搜素并输出数据(利用矩阵,其实用邻接表一样可以转化为邻接矩阵),代码入下:
输入n个顶点,
输入n-1个边,
输出dfs和bfs结果。
(这里写的时候,创建矩阵的函数必须要用指针引地址,不能直接引入,不然无法修改其中矩阵的值(好像用结构体里创建的数组初始全为0))

#include<stdio.h>
#include<stdlib.h>

typedef struct map
{
    int num;
    int Map[100][100];
} map;

typedef struct queue
{
    int front ;
    int  near ;
    int elem[100];
} queue;
int visit[100] = {0};
void createmap(map *p,int n)
{
    int u,v;
    for (int i = 1; i <= n;i++)
        for (int j = 1; j <= n;j++)
            p->Map[i][j] = 1000;
    for(int i = 1; i <= n;i++)
        p->Map[i][i] = 0;
        for (int i = 1; i < n; i++)
        {
            scanf("%d %d", &u, &v);
            p->Map[u][v] = 1;
        }
}

void dfsmap(map p,int n,int m)
{


    visit[m] = 1;
    printf("%d ", m);
    for (int i = 1; i <= n;i++)
    {
        if(visit[i]==0&&p.Map[m][i]==1)
            dfsmap(p, n, i);
    }
}

void initqueue(queue *Q)
{
    Q->front = -1;
    Q->near = -1;
}
void putin(queue *Q,int n)
{
    Q->near++;
    Q->elem[Q->near] = n;
}

int output(queue *Q)
{
    Q->front++;
    return Q->elem[Q->front];
}

int Isempty(queue *Q)
{
    return (Q->front == Q->near);
}

void bfsmap(map p,int i)
{
    int k;
    queue Q;
    initqueue(&Q);
    visit[1] = 1;
    putin(&Q, 1);

    while(!Isempty(&Q))
    {
        k = output(&Q);
        visit[k] = 1;
        printf("%d ", k);
        for (int j = 1; j <= i;j++)
            {
                if(visit[j]==0&&p.Map[k][j]==1)
                    putin(&Q, j);
            }
    }

}

int main()
{
    queue Q;
    map p;
    int i;
    scanf("%d", &i);
    createmap(&p, i);
    printf("dfs:");
    dfsmap(p, i,1);
    // for (int n = 1; n <= i;n++)
    //         {for (int m = 1; m <= i;m++)
    //             printf("%d ", p.Map[n][m]);
    //             printf("\n");}
    //printf("   bfs:");
    //bfsmap(p, i);

    return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像