第十一周 【项目3 - 图遍历算法实现】

  1. /* 程序头部注释开始  
  2. * 程序的版权和版本声明部分  
  3. * Copyright (c) 2017, 烟台大学计算机学院学生  
  4. * All rights reserved.  
  5. * 文件名称:   danlianbao.cpp                            
  6. * 作    者:   胡俊超                            
  7. * 完成日期:   2017 年 11 月 9 日  
  8. * 版 本 号:   v1.0        
  9.    
  10. * 对任务及求解方法的描述部分 
  11. * 问题描述:实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。 这里写图片描述
  12. 图的算法库

  13.    深度优先遍历——DFS
  14. #include <stdio.h>
    #include <malloc.h>
    #include "graph.h"
    int visited[MAXV];
    void DFS(ALGraph *G, int v)
    {
        ArcNode *p;
        int w;
        visited[v]=1;
        printf("%d ", v);
        p=G->adjlist[v].firstarc;
        while (p!=NULL)
        {
            w=p->adjvex;
            if (visited[w]==0)
                DFS(G,w);
            p=p->nextarc;
        }
    }
    
    int main()
    {
        int i;
        ALGraph *G;
        int A[5][5]=
        {
            {0,1,0,1,0},
            {1,0,1,0,0},
            {0,1,0,1,1},
            {1,0,1,0,1},
            {0,0,1,1,0}
        };
        ArrayToList(A[0], 5, G);
    
        for(i=0; i<MAXV; i++) visited[i]=0;
        printf(" 由2开始深度遍历:");
        DFS(G, 2);
        printf("\n");
    
        for(i=0; i<MAXV; i++) visited[i]=0;
        printf(" 由0开始深度遍历:");
        DFS(G, 0);
        printf("\n");
        return 0;
    }

  15. 广度优先遍历——BFS
  16. #include <stdio.h>
    #include <malloc.h>
    #include "graph.h"
    
    void BFS(ALGraph *G, int v)
    {
        ArcNode *p;
        int w,i;
        int queue[MAXV],front=0,rear=0; //定义循环队列
        int visited[MAXV];     //定义存放节点的访问标志的数组
        for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化
        printf("%2d",v);            //输出被访问顶点的编号
        visited[v]=1;                       //置已访问标记
        rear=(rear+1)%MAXV;
        queue[rear]=v;              //v进队
        while (front!=rear)         //若队列不空时循环
        {
            front=(front+1)%MAXV;
            w=queue[front];             //出队并赋给w
            p=G->adjlist[w].firstarc;   //找w的第一个的邻接点
            while (p!=NULL)
            {
                if (visited[p->adjvex]==0)
                {
                    printf("%2d",p->adjvex); //访问之
                    visited[p->adjvex]=1;
                    rear=(rear+1)%MAXV; //该顶点进队
                    queue[rear]=p->adjvex;
                }
                p=p->nextarc;       //找下一个邻接顶点
            }
        }
        printf("\n");
    }
    
    
    int main()
    {
        ALGraph *G;
        int A[5][5]=
        {
            {0,1,0,1,0},
            {1,0,1,0,0},
            {0,1,0,1,1},
            {1,0,1,0,1},
            {0,0,1,1,0}
        };
        ArrayToList(A[0], 5, G);
    
        printf(" 由2开始广度遍历:");
        BFS(G, 2);
    
        printf(" 由0开始广度遍历:");
        BFS(G, 0);
        return 0;
    }


  1.  1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值